javascript - 为什么在示例中 "for loop"与 "let"配合良好,而不与 "var"配合使用?

标签 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++) {
  let j = i;
  buttons[j].addEventListener('click', function() {
    console.log('You clicked button #' + j);
  });
}

here is my codepen

最佳答案

当您添加事件监听器时,您正在创建一个从封闭范围引用 i 变量的函数。该变量在循环中递增,当执行该函数时,您将在循环结束时获得该变量的值。

通过在循环内创建另一个变量,您可以在执行循环时复制该值。

关于javascript - 为什么在示例中 "for loop"与 "let"配合良好,而不与 "var"配合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45526706/

相关文章:

javascript - 比较日期 javascript

javascript - 使用javascript在包含特殊字符的URL中传递参数

javascript - 为什么 Next.js 中间件会多次运行?

使用带有量词的字符类的 JavaScript 正则表达式

java - 使用两个嵌套的 for 循环构建字符串模式会使代码太慢,两个分开会导致无法通过测试‽

java - file.nextInt 退出我的嵌套 for 循环

javascript - 我在页面上使用 jquery 和常规 javascript,没有任何问题,直到我添加了另一个函数

javascript - Vue.js 当只有一个根节点时存在多个根节点

ios - 按钮标签无法在循环中使用动态值?

c# - C# 遍历列表