为什么闭包没有用let捕获相同的变量?

时间:2018-11-24 19:20:14

标签: javascript ecmascript-6 closures ecmascript-5

这是一个规范样本,说明了闭包捕获的局部变量的问题:

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的作用域ifor循环,所有闭包始终只有一个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)

显然我错了,那么我想念什么?

0 个答案:

没有答案