1、 關鍵字 let
正如你們都熟悉的,咱們平時在寫代碼的時候,用var 聲明一個變量,除此以外,也再沒有接觸到其它的關鍵字了,無論咱們聲明什麼樣類型得變量,都用var 搞定了,很方便,可是ES6 告訴你,除了var,還能夠試試 let 來聲明變量。數組
那麼,既然var 方便,爲何還要let 來聲明,這麼說 var 聲明 必定會有不足的地方。函數
下面介紹 用 var 的不足之處。
1.先看一段代碼
var arr = [ ];
for(var i=0; i<10; i++){
arr [i] = function(){
alert(i)
}
}
arr [1](); //結果:10
很明顯,咱們執行這段代碼的想要的結果是彈出arr 這個數組對應索引的值。但發現不管索引是幾 彈出結果都是10。
Why ?
繼續執行這段代碼看看:
var arr = [ ];
for(let i=0; i<10; i++){
arr[i] = function(){
alert(i)
}
}
arr[1](); //結果:1
竟然彈出了對應索引的值!對比一下兩段代碼,惟一的不一樣之處就是循環的時候初始化變量 i 是使用let,而不是用var, Why ? ?
原來,let聲明的變量僅僅在本身使用的塊級做用域起做用,出了這個塊級做用域就不起做用了。
注意:塊級做用域 即任何一對花括號中的語句都屬於一個快,在花括號用let 定義的全部變量在花括號外都是不可見的,咱們稱之爲 塊級做用域。
那麼回到代碼中,for循環含有{ },也就是含有了塊級做用域,每一個變量 i 都只是在本身的做用域起做用,例如:第10次循環中的 i 的值不會影響到到第9次循環。
ok!
2.var 聲明變量會出現「變量提高「。
What ?
上代碼:
var a = 1;
(function(){
alert(a);
var a = 2;
})();//結果:undefined
猛的一看,結果不該該是 1 嗎,爲何會是未定義呢?
緣由就在於咱們在代碼塊(函數內)裏面還聲明並定義了一個變量a,致使變量提高了,實際的代碼執行順序是這樣的,認真看完你就明白道什麼叫變量提高了。
var a = 1;
(function(){
var a;
alert(a);
a = 2;
})();
對比一下兩段代碼:var a = 2; 這句代碼被拆分紅兩部分:聲明var a ; 和 定義a = 2;而聲明部分被提高了,到了代碼塊的前面,運行的時候本身挪到前面了,這就是「變量提高「,結果就是:先執行聲明,接着就執行alert(a);變量a只是聲明還沒定義,就彈出了undefined了。
那麼,用let關鍵字在代碼塊就不會被提高了嗎? 肯定以及確定。
var a = 1;
(function(){
alert(a);
let a = 2;
})(); // 結果:報錯a未定義
那爲何又報錯了呢,由於用let聲明的變量,在其塊級做用域內是封閉的,是不會受到外面的全局變量a影響的,而且要先聲明再使用,因此a的值即不是1(由於不受外面的影響),也不是undefined(由於先聲明後使用),更不是2,未聲明定義就使用,那只有報錯了。
注意:let關鍵字要記得先聲明定義再使用。
3.使用let 其它注意點
(1) 同一個塊級做用域內,不容許重複聲明同一個變量。
錯誤實例:
{
var a =1;
let a =2; //報錯,由於a已經用var聲明過
}
{
let a =1;
let a= 2; // 仍是報錯,a已經用let聲明過。
}
(2) 函數內不能用let從新聲明函數的參數
function say(name){
let name = 'zhang'; //報錯:用let從新聲明name參數
alert(name)
}
say('wang');
say()函數內用let從新聲明瞭name這個參數,No!
小結:
用 let 聲明變量只在塊級做用域起做用,適合在 for 循環使用,也不會出現變量提高現象。同一個代碼塊內,不可重複聲明的相同變量,不可重複聲明函數內的參數。
後續更新...