次のスニペットでは、関数の呼び出しが、iの値が保持されるまったく新しい実行コンテキストを形成する理由と方法を教えてください。
function getHandler(n) {
return function() {
alert( 'You clicked on: ' + n );
};
}
for (var i = 0; i < 100; ++i) {
myElements[i].onclick = getHandler(i);
}
次のスニペットでは、関数の呼び出しが、iの値が保持されるまったく新しい実行コンテキストを形成する理由と方法を教えてください。
function getHandler(n) {
return function() {
alert( 'You clicked on: ' + n );
};
}
for (var i = 0; i < 100; ++i) {
myElements[i].onclick = getHandler(i);
}
これは、JavaScriptのクロージャと、JavaScriptのforループで宣言された変数の動作が原因です。引数n
はaddHandler
のクロージャの一部であるため、nはそれ自体の内部で宣言された関数インスタンスの値を維持します。グローバル空間のforループからiを渡すのはたまたまです。
n
の内部でインクリメントするために何かを行う場合addHandler
、実際には効果がないことがわかりますi
。繰り返しになりますが、これはクロージャのためであり、クロージャのn
内部に存在し、addHandler
単に。によって入力されただけi
です。
クロージャのため、n
内部で作成されたものaddHandler
(この場合はいくつかの関数参照)が存在する限り、存在します。
それが理にかなっていることを願っています。説明するのは難しいと思います。
編集:JavaScriptクロージャとそれらがどのように機能するかについての素晴らしい説明があります。