这是一个规范样本,说明了闭包捕获的局部变量的问题:
var a = []
for (var i = 1; i <= 3; i++) {
a.push(() => i)
}
var v = a.map(f => f())
console.log(v)
到目前为止的结果是[ 4, 4, 4 ]
。
但是当使用i
代替let
来使var
符合条件时:
var a = []
for (let i = 1; i <= 3; i++) {
a.push(() => i)
}
var v = a.map(f => f())
console.log(v)
我们得到[ 1, 2, 3 ]
。
我不明白为什么:即使let
的作用域i
到for
循环,所有闭包始终只有一个i
,所以这应该没有改变任何东西。
对我来说,for
的{{1}}循环应等效于:
let
像AFAIK一样,它使用C,C ++,Java,C#...并且给出var a = []
{ // Scope for the loop
let i = 1
do {
a.push(() => i)
}
while (++i <= 3)
}
var v = a.map(f => f())
console.log(v)
。
显然我错了,那么我想念什么?