2012-08-10 3 views
0

지연 함수 getJSON 호출을 성공 함수 내의 지역 변수를 참조하는 for 루프 내의 배열에 추가합니다. 내가 겪고있는 문제는 success 함수가 호출되면 로컬 변수가 루프의 마지막 반복에서 값을 가져 오는 것입니다. 예를 들어 아래를 참조jQuery Deferred - 지연된 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'세 가지 경고 결과, 나는 값 '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/

+0

[자바 스크립트 악명 높은 루프 문제가 있습니까?] (http://stackoverflow.com/questions/1451009/javascript-infamous-loop-problem) – Esailija

+0

그래서, 나는 그것을 동일한 솔루션을 사용하여 일하고있어, 여기서 문제를 완전히 이해하지 마십시오. 감사. –

+0

다른 질문으로 충분하지 않다면 설명 할 수있을 것 같습니다. sec – Esailija

답변

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));