6

重複の可能性:ループ内の Javascript クロージャー -タイムアウト後のループ内の JavaScript 変数スコープ/クロージャーの
簡単な実用例

結果が異なる理由を順を追って説明していただけますか?

スニペット A (アラート 10)

for(var i=0; i<10; i++) if(i==3) setTimeout(function() {alert(i);}, 100);

スニペット B (アラート 3)

for(var i=0; i<10; i++) if(i==3) setTimeout((function(p) {
   return function() {alert(p);}
} )(i), 100);
4

1 に答える 1

4

変数のスコープは、グローバル スコープ (windowブラウザー内) または関数のいずれかです。

最初のケースでは、ループiを含むスコープで定義されています。これが、渡されたコールバックが実行されるfor前のループの終わりまで変化する理由です。setTimeout

2 番目のケースでは、中間関数に別の変数 が含まれ、保持されますp。これは、テストがなくても機能することに注意してください。これは、各setTimeout.

于 2012-11-25T17:22:10.727 に答える