在循環中解決不能靜態快照的問題
相信大家在JavaScript的學習過程中都遇到一個坑,閉包,但是這個坑不得不入的!
先上代碼:
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () { console.log(i); };
}
a[6](); // 10
a[6]會輸出多少不需要我說了吧,既然是被坑過來的,要想想爲什麼被坑了,因爲變量i是var聲明的,在全局範圍內都有效。所以每一次循環,新的i值都會覆蓋舊值,導致最後輸出的是最後一輪的i的值。
那麼,有沒有一個比較好而又優雅的解決辦法呢?
Of course!
沒有我就不會在這裏瞎BB了!
二上代碼:
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
怎樣?神奇吧? 用let聲明的就可以完美的解決不能靜態快照的問題。let 是ES6 的新標準,變量i是let聲明的,當前的i只在本輪循環有效,所以每一次循環的i其實都是一個新的變量,所以最後輸出的是6。
使用let需要在嚴格模式下。
先上代碼:
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () { console.log(i); };
}
a[6](); // 10
a[6]會輸出多少不需要我說了吧,既然是被坑過來的,要想想爲什麼被坑了,因爲變量i是var聲明的,在全局範圍內都有效。所以每一次循環,新的i值都會覆蓋舊值,導致最後輸出的是最後一輪的i的值。
那麼,有沒有一個比較好而又優雅的解決辦法呢?
Of course!
沒有我就不會在這裏瞎BB了!
二上代碼:
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
怎樣?神奇吧? 用let聲明的就可以完美的解決不能靜態快照的問題。let 是ES6 的新標準,變量i是let聲明的,當前的i只在本輪循環有效,所以每一次循環的i其實都是一個新的變量,所以最後輸出的是6。
使用let需要在嚴格模式下。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.