私はJSの初心者です。クロージャについては読んでいました。クロージャの仕組みを誤解したり、「ループ内のハンドラを設定する」のがよくある例でした。また、これを回避する方法、つまりループ変数を引数として渡して関数を返す別の関数を呼び出す方法を見て理解しました。次に、これを回避する他の方法があるかどうかを知るためにディップを試み、次のコードを作成しました。ループ内のクロージャとローカル変数
var i;
var inpArr = new Array();
for(i = 0; i < 10; ++i) {
inpArr.push(document.createElement("input"));
inpArr[i].setAttribute("value", i);
inpArr[i].onclick = function() {
var index = i;
alert("You clicked " + index);
}
document.body.appendChild(inpArr[i]);
}
私は推測してもうまくいかず、なぜ分かりませんか。 i
がキャプチャされ、生成されたすべての関数式で使用できることが分かりました。しかし、キャプチャされた変数をローカル変数index
に割り当てた後に、これがまだ機能しないのはなぜですか? i
に、別の関数の引数としてi
を渡すのと同じものを割り当てていませんか?私は、i
プリミティブではないとコピーされるはずはないという意味ですか?
私は混乱しています。誰かがここで何が起こっているか教えていただけたら、本当にありがとうと思います。
値は' i'になり、あなたがそれをクリックすると 'i'の値たびに'です:ループの中に何が起こるか
'クリック'ハンドラが 'loop'がオーバーした後にのみ呼び出されます。これを試してください:https://jsfiddle.net/rayon_1990/sgtgfk8s/ – Rayon