私は記事(JavaScript Closures for Dummies)を読んでおり、その1つの例は次のとおりです。 testlistというのと呼ばれているクロージャでローカル変数はどのように参照されますか?
function buildList(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
var item = 'item' + list[i];
result.push(function() {alert(item + ' ' + list[i])});
}
return result;
}
function testList() {
var fnlist = buildList([1,2,3]);
// using j only to help prevent confusion - could use i
for (var j = 0; j < fnlist.length; j++) {
fnlist[j]();
}
}
testList();
、 "未定義のITEM3" と言う警告ボックス。資料では、この説明があります。匿名関数は、それら全てが同じ単一の閉鎖を使用fnlist[j]();
ライン上呼ばれ
を、彼らは私が値を持つ1つの閉鎖(内iと項目の現在の値を使用しますループが完了したために3の値があり、itemの値は 'item3'です)。
なぜアイテムは 'item3'の値を持っていますか?私が3になったときのforループの終了はありませんか?終了した場合、項目はまだ 'item2'ではないはずですか?または、testListが関数を呼び出すときに変数項目が再度作成されますか?
リンクするよりも多くのテキストが表示されるバグですか? – CookieOfFortune