为什么输出如下代码:
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/