8

重複の可能性:
JavaScript クロージャーはどのように機能しますか?

同じ古い JavaScript クロージャー ループの問題の何百万もの重複をすべて読みました。私はそれらを理解していると思い、今日まで何ヶ月も問題なく閉鎖を使用してきました. 私は困惑しています。

for (var i in groups){
    for(var j in groups[i]){
        $(unique_form).die('submit').live('submit'), function{
             function (groups2, i2, j2){
                 return function(){alert(groups2[i2][j2])}
              }(groups, i, j)
             }
         });
        }               
    }
 }

それぞれの固有のフォームを送信すると、groups[i][j] の最後の要素のアラートが表示され続けます。明らかに、私は何か愚かなことをしています、それは何ですか?匿名関数 groups2、i2、および j2 を作成することで、問題を解決していると考えました。

4

3 に答える 3

8

渡す関数は、submit イベントが発生したときに.live()実行されます。その時点までに、とは最終的な値になります。イベント ハンドラーの外側でクロージャーを作成する必要があります。ij

(function (i2, j2) {
    $(unique_form).die('submit').live('submit', function{
        alert(groups[i2][j2])
    });
}(i, j));

groups無名関数から引数を削除したことに注意してください。その値は変更されないため、それを閉じる必要はありません。また、関数式全体を括弧で囲みました。これは慣例です (この場合、式として解析されるようにするために実際に必要です)。

.live()また、質問の最初の引数の後にある閉じ括弧を削除したことにも注意してください。そこにあるべきではありません。


サイドノート

.live()そして.die()今では古くから非推奨になっています。.on()(jQuery 1.7 以降の場合) または.delegate()(古いバージョンの場合)を使用します。

于 2013-01-16T21:54:18.253 に答える
0

コードは、groups.length正方形のライブ送信ハンドラーを設定します。各ライブ ハンドラーは、この関数の異なるコピーで構成されます。

function{
    function (groups2, i2, j2){
        return function(){alert(groups2[i2][j2])}
    }(groups, i, j)
}

submit イベントが発生すると、すべてのライブ ハンドラー ファイルがファイルされ、それぞれが と の最後値を参照します。ij

コード フラグメントに基づいて本当に欲しいものを言うのは難しいです。より多くの情報があれば、おそらくもっと役立つでしょう。幸運を!

于 2013-01-16T21:55:58.177 に答える
-1

これを試してみてください

for (var i in groups){
    for(var j in groups[i]){
        $(unique_form).die('submit').live('submit', function( groups2, i2, j2 ){
             return function (){
                 alert(groups2[i2][j2])
             }
         }(groups, i, j) );
        }               
    }
 }
于 2013-01-16T21:54:41.747 に答える