2011-05-05 7 views
1

나는 다음과 같은 상황이 :요청 호출시 콜백 함수에 값을 전달하는 방법은 무엇입니까?

var foo = [ 0, 1, 2 ] 
for (var i in foo) { 
    Asyncstuff.get(URI).on('response', function(res) { console.log(i); } }); 
} 

CSTE 연구진 ('응답', ...)를 비동기 방식으로 호출되기 때문에를, 출력은 대부분

2 
2 
2 

이 거기에있을 것이다 .get()이 콜백 함수에 호출 될 때 i의 값을 전달할 가능성이 있습니까?

답변

7

폐쇄가 필요합니다. 이 이것보다 더 나은 방법이있다, 그러나 이것은 명확하게 개념을 설명한다 : cwolves으로

var foo = [ 0, 1, 2 ] 
for (var i in foo) { 
    (function(i){ 
     Asyncstuff.get(URI).on('response', function(res) { console.log(i); } }); 
    })(i); 
} 
1

은 폐쇄를 사용하여 포장 할 필요가 언급했다. 그 이유는 JavaScript와 다른 언어 (예 : C#) 클로저는 "values"가 아닌 "variables"를 캡쳐합니다. 그러므로 코드에서 변수 "i"는 내부 함수에 의해 캡처되고 해당 함수가 실행될 때 캡처 된 변수 "i"는 루프가 끝날 때 루프의 마지막 값이됩니다. 변수를 캡처하는 JavaScript와 같은 언어로 클로저를 사용할 때는주의해야합니다.

cwolves 솔루션에서 함수 내부의 "i"는 새로운 변수가되고 for 루프의 I와 동일하지 않으므로 잘 작동합니다.

관련 문제