2016-08-19 14 views
-2

私はこのループを持っています。 isetTimeoutを渡してみると、「最終結果がi」という同じ結果が得られます。setTimeoutを使ってどのようにユーザーを登録できますか?

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

     setTimeout(function( ){ 

      insideJMove.doMove(i); 

     } , 1000); 

    } 

は、どのように私は、各サイクルにおけるsetTimeout内部iの異なる値を得ることができますか?

答えて

3

これを回避するには2つの方法があります。これは、varで定義された変数のスコープが現在の実行コンテキストであるために発生します。 iをループ内で再利用されるグローバル変数にします。

はletキーワードを使用します。

[せ] [ループのための](匿名)内部関数のインスタンスは、変数の異なるインスタンスを参照するため意図したとおりに動作します私

ためである:LETによって宣言された変数は、その範囲、それらが定義されているブロックとして、並びに任意に含まれるサブブロックを持っている

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 
関連する問題