javascript - 用 `let` 定义的变量如何在 `for` 循环中起作用

标签 javascript for-loop let

<分区>

documentation for the let statement in MDN ,有这个示例代码:

var list = document.getElementById("list");

for (let i = 1; i <= 5; i++) {
  let item = document.createElement("li");
  item.appendChild(document.createTextNode("Item " + i));

  item.onclick = function (ev) {
    console.log("Item " + i + " is clicked.");
  };
  list.appendChild(item);
}

然后他们说:

The example above works as intended because the five instances of the (anonymous) inner function refer to five different instances of the variable i.

我不明白为什么有“变量 i 的五个不同实例。

for 循环中的第一条语句总是执行一次,不是吗? 所以 let 语句应该只执行一次...
一旦代码到达迭代的末尾,它就会检查第二条语句中的条件。

为什么,根据他们写的,每次迭代都有一个新的 i 实例?

最佳答案

当使用 let 表达式时,每次迭代都会创建一个链接到前一个范围的新词法范围。

这意味着每个闭包捕获不同的实例。

那是根据ECMA 6 specification但不确定它在所有浏览器中的工作方式是否相同。

也不确定对性能的影响。我宁愿谨慎使用此功能。

关于javascript - 用 `let` 定义的变量如何在 `for` 循环中起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38118505/

相关文章:

javascript - 自动生成具有绝对位置的左侧和顶部 css

javascript - Chartjs - 不显示第一个 x 轴刻度

javascript - 通过 JavaScript 在 DIV 内执行 HTML 代码

javascript - 在具有多个循环的函数中使用 var 吗?

javascript - 为什么多维数组只在每个单元格上执行函数?

javascript - 如何在javascript中获取两个数组之间的差异?

Java 项目可能因循环错误而崩溃

python - 在 pandas 数据框中搜索字符串

javascript - p5 两个数​​组的碰撞检测不起作用

haskell - 不使用 in 时 let 的范围是什么?