for循环中的JavaScript闭包
正如这里所解释的,下面的代码只输出“5x5”的结果,在此之前忘记了任何事情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); }); }
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); });
})();
}
}