2013-10-10 3 views
2

다음 작업을 수행해야합니다. 그러나 이것은 항상 1,2,3,4 및 5 대신에 "5"만을 경고합니다. 어떻게 해결할 수 있습니까? 도와주세요.루핑 JS 변수가 함수 내에 올바른 값을 표시하지 않습니다.

for(var x=1; x<=5; x++){ 
     something.load(function(result){ 
      alert(x); 
     }); 
    } 
+0

나는 많이 알 제안 된 사본은 알려진 지식의 다른 방향이나 다른 수준에서 질문을하는 경향이 있습니다. 즉, 이미 문제가 폐쇄와 관련이 있다는 것을 알고있는 질문입니다. – Katana314

답변

9

이것은 폐쇄로 인한 것입니다. 콜백이 실행되면 현재 상태의 변수에 경고를 보냅니다 (루프 이후).

이 문제를 해결하려면 변수 상태를 유지할 새 클로저를 만들 수 있습니다. 폐쇄에 대한보다 자세한 설명은

for(var x=1; x<=5; x++){ 
    (function(x) { 
     something.load(function(result){ 
      alert(x); 
     }); 
    }(x)); 
} 

,이 SO 질문을 참조 할 수 있습니다 : How do JavaScript closures work?

또는 TC39의 구성원이 문서 (ECMA 스크립트 표준 몸) http://www.2ality.com/2013/05/quirk-closures.html

+0

이 경고는 1에서 5까지의 순서로 전달됩니까? – TechyTee

+0

아니요, 콜백 함수가 트리거되는시기에 따라 다릅니다. 두 번째 호출이 먼저 도착하면 2 이전에 1을 호출합니다.이 시점에서 흐름은 루프에 의해 제어되지 않고 비동기 작업에 의해 제어됩니다. 이러한 콜백을 순서대로 트리거해야하는 경우 Async.js 또는 Promise 사양 (jQuery에는 사용할 수있는 빌트인 약속 구현이 있음)과 같은 비동기 흐름 라이브러리를 체크 아웃해야합니다. –

관련 문제