喵喵時光機(jī)
2018-12-10 17:15:43
for (let i = 0; i < 5; i++) { a[i] = function() { console.log(i) } } a[2]() //2i為什么不是undefined,for循環(huán)里面我只是創(chuàng)建了一個函數(shù),為什么我執(zhí)行a[2]的時候還是能拿到i的值
1 回答

手掌心
TA貢獻(xiàn)1942條經(jīng)驗 獲得超3個贊
因為let具有塊級作用域的特性,因此i只會在當(dāng)前循環(huán)有效。
實際上你的循環(huán)創(chuàng)建了5個塊級作用域,每一個i值都只在當(dāng)前的塊級作用域中有效果。
你的代碼等同于如下:
"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值都保存在了一個閉包中。因此這個循環(huán)創(chuàng)建了5個閉包。
而a數(shù)組里則保存了一堆函數(shù),每一個函數(shù)都訪問了對應(yīng)的閉包中的i值。
所以i的值肯定是存在的而不undefined。
當(dāng)你看不懂ES6語法相關(guān)的代碼時,可以利用babel的在線工具將ES6的例子轉(zhuǎn)換成ES5的代碼。 在線地址
添加回答
舉報
0/150
提交
取消