0

ここで説明されているようにhttp://www.mennovanslooten.nl/blog/post/62/以下のコードは、「5x5」の結果を出力し、それより前のことを忘れています。

for (x = 1; x <= 5; x++) {
for (y = 1; y <= 5; y++) {

    var cords = x+"x"+y;
    var el = document.getElementById(cords);
    el.addEventListener("click", function (e) { B_modeWindow('1', cords); });

}
}

私が情報を持っている限り(上記のブログリンク)、表示されたコードを変更して修正する方法がわかりません。

for ループで JavaScript クロージャを使用してこのコードを回避するにはどうすればよいですか?

編集:わかりません。変数は適切に定義されています。テスト:

for (x = 1; x <= 5; x++) {
for (y = 1; y <= 5; y++) {

    var cords = x+"x"+y;
    alert(cords);

}
}
4

3 に答える 3

1

Minitechは近かったが、閉じた変数を関数内に移動する必要があります。

for (x = 1; x <= 5; x++) {
    for (y = 1; y <= 5; y++) {
        (function() {
            var cords = x + "x" + y;
            var el = document.getElementById(cords);
            el.addEventListener("click", function (e) { B_modeWindow('1', cords); });
        })();
    }
}
于 2012-09-09T22:24:33.833 に答える
1

閉じる必要があるものを引数として関数を呼び出します。この場合、それはcords.

for (x = 1; x <= 5; x++) {
    for (y = 1; y <= 5; y++) {
        var cords = x + "x" + y;
        var el = document.getElementById(cords);

        (function(cords) {
            el.addEventListener("click", function (e) { B_modeWindow('1', cords); });
        })(cords);
    }
}
于 2012-09-09T21:35:56.030 に答える
0

問題は、js 変数には関数スコープがあるため、コード変数はループを通過するときに書き換えられることです。したがって、すべてのリスナー関数は、最終的な値で終わる同じ変数を指します。これに対する 1 つの解決策は、el と cords を引数として受け取り、cords ベースのリスナーを el に追加する別の関数を作成することです。次に、リスナーを直接追加するのではなく、内側のループからこの関数を呼び出します。

于 2012-09-09T21:40:48.957 に答える