Javascript 在本例中,为什么“for循环”与“let”配合良好,而与“var”不配合?
有人能解释为什么第一个代码总是打印3吗 第二个代码运行良好吗Javascript 在本例中,为什么“for循环”与“let”配合良好,而与“var”不配合?,javascript,for-loop,Javascript,For Loop,有人能解释为什么第一个代码总是打印3吗 第二个代码运行良好吗 var buttons = document.getElementsByTagName('button'); for (var i = 0; i < buttons.length; i++) { buttons[i].addEventListener('click', function() { console.log('You clicked button #' + i); });
var buttons = document.getElementsByTagName('button');
for (var i = 0; i < buttons.length; i++) {
buttons[i].addEventListener('click', function() {
console.log('You clicked button #' + i);
});
}
vs
添加事件侦听器时,您正在创建一个引用封闭范围中的i变量的函数。该变量在循环中递增,当函数执行时,在循环结束时获得该变量的值
通过在循环中创建另一个变量,可以在执行循环时复制该值。基本上可以查看闭包section@ezz对不起,我之前的评论不正确。OP需要一个IIFE来实现与var相同的功能。var创建了一个闭包,而不是。请看,谢谢..这很有帮助..那么基本上我也可以使用var吗?是和否。var是函数作用域,因此如果您只是将let更改为var,它将不起作用,因为您仍然将引用与i变量作用域相同但最终值不同的单个变量。你需要一个生命:把这个团放在一个你马上调用的函数的循环中。考虑到它的范围,让我们避免增加这个级别。我不明白你的解释。你是说for循环的每一次都没有执行事件函数吗?好吧…现在我明白为什么forEach没有这个问题了,因为它总是在同一个范围内!!!。。。多谢各位much@JasonKrs它只在事件实际发生时执行,而不是立即在循环中执行
var buttons = document.getElementsByTagName('button');
for (var i = 0; i < buttons.length; i++) {
let j = i;
buttons[j].addEventListener('click', function() {
console.log('You clicked button #' + j);
});
}