最近看了很多文章,偶然間看到ES6中新增了一個關鍵字 let ,它具有與 var 關鍵字相似的功能。一開始使用它時,發現它讓我對之前一些習以為常的東西產生了懷疑。 下麵先讓我們看看它和 var 之間用法的不同 { var a = 10; let b = 8; } a //10 b // Refere ...
最近看了很多文章,偶然間看到ES6中新增了一個關鍵字 let ,它具有與 var 關鍵字相似的功能。一開始使用它時,發現它讓我對之前一些習以為常的東西產生了懷疑。
下麵先讓我們看看它和 var 之間用法的不同
{
var a = 10;
let b = 8;
}
a //10
b // Referenceerror :b is not defined
上面在代碼塊中聲明瞭兩個變數並分別賦值輸出到控制台,結果a的變數成功輸出,b的輸出結果產生了報錯。可見,let聲明的變數只在它所在的代碼塊中產生作用。同時,我們也能想到它最好的使用方法就是在for迴圈中使用。
下麵我們再舉個例子來觀察它與 var 之間的區別:
var a = [ ]
for(var i = 0;i<6; i++){
a[i] = function(){
console.log(i);
}
}
console.log("i的值:",i);
a[ 4 ]( );
它的輸出結果為:
i 的值:6
6
為什麼是 6 呢?一開始我也被嚇懵逼了,這有悖於我的常識,以往沒註意到的地方,居然這麼的low。在我的意識里結果應該 4,而不是 6 。我想了很久也想不明白,以我這種小白的技術,自然是很難搞懂這種資深技術宅的問題。所以,我查了很多資料來解決這個問題,才搞明白。
在for里用 var 聲明的 i 是全局變數,在迴圈外部也可以訪問到,在迴圈體內每次迴圈都給 i 重新賦一次值,而 i 卻是屬於全局的,外部的 i 值最終是 6 ,數組 a[ ]指向的 i 始終都是同一個 i,當迴圈結束時 a [ ] 函數內部的 i 就是最終 i 的結果 6。
如果使用let,聲明的變數只在當前代碼塊中起作用
var a = [ ]
for(let i = 0;i<6; i++){
a[i] = function(){
console.log(i);
}
}
console.log("i的值:",i);
a[ 4 ]( );
它的輸出結果為:
i 的值:6
4
上面代碼中,變數i是let聲明的,當前的i只在本輪迴圈有效,所以每一次迴圈的i其實都是一個新的變數,所以最後輸出的是4。你可能會問,如果每一輪迴圈的變數i都是重新聲明的,那它怎麼知道上一輪迴圈的值,從而計算出本輪迴圈的值?這是因為 JavaScript 引擎內部會記住上一輪迴圈的值,初始化本輪的變數i時,就在上一輪迴圈的基礎上進行計算。