为什么结果不同(使用var vs. let)?

duk*_*god 6 javascript arrays closures ecmascript-6

这用 var

var a = [];
for (var i = 0; i < 10; i++) {
    a[i] = function() {
        console.log(i);
    };
}
a[6](); // 10
Run Code Online (Sandbox Code Playgroud)

这用 let

var a = [];
for (let i = 0; i < 10; i++) {
    a[i] = function() {
        console.log(i);
    };
}
a[6](); // 6
Run Code Online (Sandbox Code Playgroud)

我不明白为什么结果不同.有人可以指导我吗?

Sal*_*n A 5

结果数组由函数组成,每个函数体如下所示:

console.log(i);
Run Code Online (Sandbox Code Playgroud)

i取决于我们是使用var还是let声明变量.

var (ECMAScript 5和6)

i是一个全局变量,其值10在退出循环后.这是记录的值.

let (ECMAScript 6)

i是一个局部变量,其范围仅限于该for语句.此外,此变量在每次迭代时都会获得新的绑定.最好的解释是您的代码转换为ECMAScript 5:

"use strict";
var a = [];
var _loop = function(i) {
    a[i] = function() {
        console.log(i);
    };
};
for (var i = 0; i < 10; i++) {
    _loop(i);
}
a[6](); // 6
Run Code Online (Sandbox Code Playgroud)

因此,例如,在第七次迭代中,值i将是6(从零开始计数).在迭代内创建的函数将引用此值.