for循环中的JavaScript闭包

for循环中的JavaScript闭包,javascript,for-loop,Javascript,For Loop,正如这里所解释的,下面的代码只输出“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); }); }

正如这里所解释的,下面的代码只输出“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(x=1;x调用函数,并将需要关闭的任何内容作为参数。在本例中,这是
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);
    }
}

用于(x=1;x问题在于js变量具有函数作用域,因此在循环过程中会重写cords变量。因此,所有侦听器函数都指向同一个变量,该变量的最终值。解决方法之一是创建另一个函数,该函数将el和cords作为参数,并向el添加基于cords的侦听器。然后从内部循环调用此函数,而不是直接在那里添加侦听器。

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); });
        })();
    }
}

用于(x=1;x是minitech提出的吗?@user1656447不,它有点相反。minitech的答案应该也能起作用。它们关闭
跳线
变量以解决问题。但他没有关闭
el
,这也在函数中使用。
el
仅在实际的
for
循环中使用在执行
for
循环时。它不在稍后运行的事件处理程序中使用,因此不需要关闭它。
coords
用于事件处理程序回调本身(例如,在事件发生时稍后引用),因此必须关闭它。这一点很好(在闭包的迷宫中很容易迷路,我甚至有多年的Lisp经验)。我想知道为什么OP说它不起作用。gentles,这是一些疯狂的东西。谁发明了这种语言?@user1656447-如果这不起作用,那么你必须有一些你没有展示过的东西也会引起问题,因为这个例子解决了
cords
变量的
for
循环问题。它应该在每个Java中新手书
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); });
        })();
    }
}