0

成功関数内のローカル変数を参照する for ループ内の配列に遅延 getJSON 呼び出しを追加しています。私が抱えている問題は、成功関数が呼び出されたときに、ローカル変数がループの最後の反復から値を取得していることです。以下の例を参照してください。

var calls = [];
var arr = ['a','b','c'];
for (var a in arr) {
    calls.push(
        $.getJSON(window.location, function() { alert(arr[a]); })
    );
}
$.when.apply($,calls);

jsFiddle: http://jsfiddle.net/Me5rV/

これにより、値「c」の 3 つのアラートが生成されますが、値「a」、「b」、および「c」が必要です。これは可能ですか?

編集:以下は機能しますが、なぜこれが異なるのか完全にはわかりませんか?

var calls = [];
var arr = ['a','b','c'];
for (var a in arr) {
    calls.push(
        $.getJSON(window.location, function(x) {
            alert(x);
       }(arr[a]))
    );
}
$.when.apply($,calls);

jsFiddle: http://jsfiddle.net/Me5rV/1/

4

1 に答える 1

1

次のようなループを確認します。

var a = [];

for( var i = 0; i < 3; ++i ) {
    a.push( function() {
        alert(i);
    });
}

実際には:

var a = [], i = 0;

a.push( function(){
    alert(i);
});

i++;

a.push( function() {
    alert(i);
});

i++;

a.push( function() {
    alert(i);
});

i++;

//condition isn't met, loop terminates

alert(i) //alerts 3 because i is 3 now.
         //That's why all the functions alert 3, because they all 
         //refer to this i and its value is 3

代わりにこれを行うことができます(繰り返しは削除されました):

a.push( function(i){
    return function() {
         alert(i); //Refers to the i passed as argument to the outer function
                   //not the global one
                   //The local i has whatever value the global i had when it was passed
                   //as argument
    };
}(i));
于 2012-08-10T14:46:08.657 に答える