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

使用您需要关闭的任何内容作为参数调用该函数。在这种情况下,就是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 回答
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 回答
0

问题是 js 变量具有函数作用域,因此当您通过循环时,cords 变量会被重写。因此,所有侦听器函数都指向同一个变量,该变量以最终值结束。对此的一种解决方案是创建另一个函数,该函数将 el 和 cords 作为参数,并向 el 添加一个基于 cords 的侦听器。然后从你的内部循环调用这个函数,而不是直接在那里添加监听器。

于 2012-09-09T21:40:48.957 回答