2016-08-19 2 views
-2

이 루프가 있습니다. isetTimeout으로 전달하려고하면 "i의 최종 결과"와 같은 결과가 나타납니다.setTimeout으로 어떻게 사용자를 등록 할 수 있습니까?

for(var i = 0; i < step.length; i++ ){ 

     setTimeout(function( ){ 

      insideJMove.doMove(i); 

     } , 1000); 

    } 

어떻게 각주기에 setTimeout 내부 i의 다른 값을받을 수 있나요?

답변

3

두 가지 방법으로이 문제를 해결할 수 있습니다. 이는 var으로 정의 된 변수의 범위가 현재 실행 컨텍스트이기 때문에 발생합니다. i을 루프에서 재사용 할 전역 변수로 지정하십시오.

는하자 키워드를 사용

[하자] [루프의]를 (익명) 내부 함수의 인스턴스 변수의 다른 인스턴스를 참조하기 때문에 의도 한대로 작동 내가

뿐만 아니라 서브 블록

0 포함 된 같이 해당 범위로 그들이 정의 된 블록을 보자 선언

변수 : 때문에

이입니다

for(let i = 0; i < step.length; i++ ){ 

    setTimeout(function( ){ 

     insideJMove.doMove(i); 

    } , 1000); 

} 

즉시 호출 함수식

이 새로운 실행 문맥을 생성 여기서 함수식이 실행될 때 그것이 어떤 같은 i 체류 값. 비동기

for(var i = 0; i < step.length; i++ ){ 
    (function(i){ 
     setTimeout(function( ){ 

      insideJMove.doMove(i); 

     } , 1000); 
    })(i); 

} 
+1

그것은 사실이라고 인생 (즉시-호출 함수 표현식) : 솔루션의

하나는 재귀을 사용하는 것입니다. –

0

의 setTimeout 실행 루프 정도로 너무 변수 I 의지 그것을 루프의 마지막 값을 가지며, 그 첫번째의 setTimeout를 호출 할 때 위에있을 것이다.

var i=0; 
function loop(){ 

    insideJMove.doMove(i); 

    if (i<step.length) 
    setTimeout(loop,1000); 

    i++; 
} 

loop();//start our loop 
관련 문제