2012-04-25 18 views
3

可能性の重複:奇妙な値

for(var i = 1; i <= 5; i++){ 
    $('<div class="e-' + i + '"></div>').appendTo(something).click(function(){ 
    alert(i); // <-- it's 6. wtf?? 
    }); 
} 
:私はすべてのdiv要素のためにここに私の関数の内部で "6" を取得するいくつかの理由

Javascript infamous Loop problem?

,1,2,3などの代わりに

一方、クラスは正しく設定されているようです。

私は間違っていますか?

+1

は:ref:http://stackoverflow.com/questions/1451009/javascript-infamous-loop-problem – Yoshi

+0

は、これが "最後の1のみ" の問題と呼ばれている

はこれを試してみてください。以下の答えはそれをうまくまとめたものですが、私はしばらく前の記事を書いています:http://lynxphp.com/javascript/javascript-immediate-functions/ – callumacrae

答えて

11

forループがページ読み込み時に実行されています。 forループが終了した後に発生しているクリックイベントがある場合にのみ警告が発生します。したがってiの値がforループはいつか後にクリックイベントが発射されるそのようなもの...

2)を行い、今6

1)ページがロードされます。 forループが既に完了しているため、この時点でのiの値は6です。

5

問題は、あなたがクリック機能をバインドする時にiを捕捉するためにクロージャを作成する必要があるということです。

for(var i = 1; i <= 5; i++) 
{ 
    $('<div class="e-' + i + '"></div>') 
    .appendTo(something) 
    .click(function(value) 
    { 
     return function() { alert(value) }; 
    }(i)); 
} 
+0

なぜ匿名関数を使用しないのですか?それは良く見える。 – callumacrae

+0

また、jsにブロックスコープがないため、ループ内の 'var fn'は誤解を招きます。 – Yoshi

+0

ブロックスコープが不足していることを知りませんでした。いずれにせよ、私の未編集の答えはうまくいきます。 – wsanville