for (let i = 0; i < 5; i++) { a[i] = function() { console.log(i) } } a[2]() //2i为什么不是undefined,for循环里面我只是创建了一个函数,为什么我执行a[2]的时候还是能拿到i的值
1 回答

手掌心
TA贡献1942条经验 获得超3个赞
因为let具有块级作用域的特性,因此i只会在当前循环有效。
实际上你的循环创建了5个块级作用域,每一个i值都只在当前的块级作用域中有效果。
你的代码等同于如下:
"use strict";
var _loop = function _loop(i) {
a[i] = function () {
console.log(i);
};
};
for (var i = 0; i < 5; i++) {
_loop(i);
}
a[2]();
这里就很容易能看出:
实际上let的存在让每一个i值都保存在了一个闭包中。因此这个循环创建了5个闭包。
而a数组里则保存了一堆函数,每一个函数都访问了对应的闭包中的i值。
所以i的值肯定是存在的而不undefined。
当你看不懂ES6语法相关的代码时,可以利用babel的在线工具将ES6的例子转换成ES5的代码。 在线地址
添加回答
举报
0/150
提交
取消