1

私は3つ持っていて、番号[0、1、または2]が-edのときに属する.aことを警告するはずの関数があります。.amouseover

​function a(){
    for(var c=0; c<3; c++){
        alert(c);
        $('.a:eq('+c+')').mouseover(function(){alert(c)});       
    }

}

実行すると、最初のalert(c)トリガーが3回トリガーされ、メッセージはそれぞれ「0」、「1」、「2」になります。

ただし、の場合はmouseover .aどちらであっ.aても「3」と警告します。

http://jsfiddle.net/f6tQn/

誰かがなぜこれが起こっているのかを説明し、解決策を提供していただければ幸いです。

4

4 に答える 4

5

c=3だからです。

ループは実行されるCたびに に 1 を追加Cしますが、コードの実行後も 3 に等しいため、アラートに の値C、つまり 3 が与えられます。

あなたの例は完全に書き直して単純化することができます

$('.a').mouseover(function(){
    alert($(this).index());
});

これにより、 class を持つすべての要素に対してアラートが生成され、生成さaれる配列内での位置が示され$('.a')ます。

ところで:関数をループに入れるとJSLintエラーが発生します。JSLintを満足させたい場合は、この質問をチェックしてください

于 2012-05-21T19:28:00.013 に答える
1

これは、各mouseover関数が同じ値のを使用しているために発生しています。cこれは3、ループが完了したときです。

c各反復の値を「キャプチャ」するには、クロージャを作成する必要があります。

function a(){
    for(var c=0; c<3; c++){
        alert(c);
        var func = function(c){
            return function(){ // closes around the current value of "c"
                alert(c);
            };
        };
        $('.a:eq('+c+')').mouseover(func(c));       
    }
}

デモ:http://jsfiddle.net/vDbu3/

于 2012-05-21T19:35:35.353 に答える
1

JavaScript の関数スコープ変数に引っかかっています。これは大きな JavaScript の問題です。

for ループの本体で実行したいことを実行し、c をパラメーターとして受け取る関数を作成する必要があります。

于 2012-05-21T19:29:03.380 に答える
1

C はメモリ内の同じ物理的な場所にバインドされているため、マウスオーバーでアラートを実行すると、最後に設定された値である 3 からプルされます。

主題についてより深く読みたい場合は、実際に変数 c の「クロージャ」を作成します。

これを試して

function a(){
    for(var c=0; c<3; c++){
        alert(c);
        (function(a){
           $('.a:eq('+a+')').mouseover(function(){alert(a)});
        })(c);      
    }

}
于 2012-05-21T19:30:26.270 に答える