javascript - Javascript 中循环初始化中定义的变量范围?

标签 javascript arrays function

为什么输出如下代码:

let nodes = [];
for (let i = 0; i < 5; ++i) {
    nodes[i] = () => i;
}
for (let node of nodes) {
    console.log(node());
}

0 1 2 3 4 ,同时输出以下代码:

let nodes = [];
let i;
for (i = 0; i < 5; ++i) {
    nodes[i] = () => i;
}
for (let node of nodes) {
    console.log(node());
}

5 5 5 5 5

最佳答案

let变量的作用域为您使用它的 block 。

如果您使用let 外部for block ,然后创建由您创建的每个函数共享的一个变量(并且每次循环时都会更改该变量的值)。

如果您使用let 在其中,您每次循环时都会创建一个新变量,因此每个函数都有自己的变量,其值您不会更改。

How do closure and environment context come into play in this?

他们确实没有。这只是每个函数是否在相同的 i 上关闭的问题或不同的i ...并且您没有使用this .

您使用的函数类型无关紧要。使用函数表达式可以获得相同的效果。

关于javascript - Javascript 中循环初始化中定义的变量范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60599906/

相关文章:

javascript - 从对象数组中创建对象特定字段的数组

javascript - 如何递归获取嵌套对象中所有子对象的列表?

javascript - 浏览器后退按钮显示缓存中的页面?

javascript - js如何在字符串上使用splice?

javascript - nodejs函数返回未定义

java - 循环搜索数组,打印多个结果

JavaScript——无法理解 Array.Map 和 Array.reduce

java - 测试失败,我做错了什么?

c - linux下C如何区分字符串中的数据类型?

c - 如何从 C 函数返回指针?