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)
我不明白为什么结果不同.有人可以指导我吗?
结果数组由函数组成,每个函数体如下所示:
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(从零开始计数).在迭代内创建的函数将引用此值.