2
var count = 0; 
for ( var i = 0; i < 4; i++ ) { 
  setTimeout(function(){ 
    assert( i == count++, "Check the value of i." ); 
  }, i * 200); 
}

なぜこれが機能しないのですか(i毎回カウントするのではなく、4に等しくなります)?count, varグローバルスコープで作成されているのに、関数内で使用できないのはなぜですか?

(これが機能しない理由について説明したいのですが、理解したいだけで、別の関数でラップして機能させる方法を見つけました)

4

1 に答える 1

6

これを使って; iの値は各setTimeout内で4になります。forループはすでに終了しており、

匿名関数は、新しいコンテキストを作成することにより、その中の変数を保持します。

var count = 0; 
for ( var i = 0; i < 4; i++ ) { 
  (function(i){
     setTimeout(function(){ 
            assert( i == count++, "Check the value of i." ); 
      }, i * 200);
  })(i); 
}
于 2013-03-21T20:57:10.190 に答える