2

次のコードを見てください

//btns is an array passed as a parameter to a function
for(var i = 0, b; b = btns[i]; i++) {
    b.handler = function () {
        var a = btns[i].some_field; //undefined
        //the same for "b.some_field;"
    };
}

なぜbtns[i]未定義なのですか?

PS。それが重要な場合、コードはextjsボタンにクリックハンドラーを追加します。

4

2 に答える 2

4

これは、内部関数が呼び出されるまで (ループが完了した後) の値がiwould であるbtns.lengthため、btns[i]wouldundefinedの値が

i次のように値を閉じる必要があります。

b.handler = function(i) {
    return function() {
        var a = btns[i].some_field;
    }
}(i);

変数は同じ名前ですが、異なる変数であることに注意してください。つまり、内側の変数は外側の変数を隠し、それによって値を「修正」します。

于 2013-08-12T07:42:53.810 に答える