1

次のスニペットでは、関数の呼び出しが、iの値が保持されるまったく新しい実行コンテキストを形成する理由と方法を教えてください。

function getHandler(n) {
    return function() {
        alert( 'You clicked on: ' + n );
    };
}

for (var i = 0; i < 100; ++i) {
    myElements[i].onclick = getHandler(i);
}
4

1 に答える 1

2

これは、JavaScriptのクロージャと、JavaScriptのforループで宣言された変数の動作が原因です。引数naddHandlerのクロージャの一部であるため、nはそれ自体の内部で宣言された関数インスタンスの値を維持します。グローバル空間のforループからiを渡すのはたまたまです。

これがその振る舞いを示すフィドルです。

nの内部でインクリメントするために何かを行う場合addHandler、実際には効果がないことがわかりますi。繰り返しになりますが、これはクロージャのためであり、クロージャのn内部に存在し、addHandler単に。によって入力されただけiです。

これがその振る舞いを示すフィドルです。

クロージャのため、n内部で作成されたものaddHandler(この場合はいくつかの関数参照)が存在する限り、存在します。

それが理にかなっていることを願っています。説明するのは難しいと思います。

編集:JavaScriptクロージャとそれらがどのように機能するかについての素晴らしい説明があります。

于 2012-05-23T03:38:59.283 に答える