Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在本例中,为什么“for循环”与“let”配合良好,而与“var”不配合?_Javascript_For Loop - Fatal编程技术网

Javascript 在本例中,为什么“for循环”与“let”配合良好,而与“var”不配合?

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

有人能解释为什么第一个代码总是打印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);
      });
    }
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);
  });
}