在循環中解決不能靜態快照的問題

相信大家在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需要在嚴格模式下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章