正如大家都熟悉的,我們平時在寫**的時候,用var 宣告乙個變數,除此之外,也再沒有接觸到其它的關鍵字了,不管我們宣告什麼樣型別得變數,都用var 搞定了,很方便,但是es6 告訴你,除了var,還可以試試 let 來宣告變數。
那麼,既然var 方便,為什麼還要let 來宣告,這麼說 var 宣告 一定會有不足的地方。
下面介紹 用 var 的不足之處。
1.先看一段**
var arr = [ ];
for(var i=0; i<10; i++)
}arr [1](); //結果:10
很明顯,我們執行這段**的想要的結果是彈出arr 這個陣列對應索引的值。但發現無論索引是幾 彈出結果都是10。
why ?
繼續執行這段**看看:
var arr = [ ];
for(let i=0; i<10; i++)
}arr[1](); //結果:1
居然彈出了對應索引的值!對比一下兩段**,唯一的不同之處就是迴圈的時候初始化變數 i 是使用let,而不是用var, why ? ?
原來,let宣告的變數僅僅在自己使用的塊級作用域起作用,出了這個塊級作用域就不起作用了。
注意:塊級作用域 即任何一對花括號中的語句都屬於乙個快,在花括號用let 定義的所有變數在花括號外都是不可見的,我們稱之為 塊級作用域。
那麼回到**中,for迴圈含有,也就是含有了塊級作用域,每個變數 i 都只是在自己的作用域起作用,例如:第10次迴圈中的 i 的值不會影響到到第9次迴圈。
ok!2.var 宣告變數會出現「變數提公升「。
what ?
上**:
var a = 1;
(function
())();//結果:undefined
猛的一看,結果不應該是 1 嗎,為什麼會是未定義呢?
原因就在於我們在**塊(函式內)裡面還宣告並定義了乙個變數a,導致變數提公升了,實際的**執行順序是這樣的,認真看完你就明白道什麼叫變數提公升了。
var a = 1;
(function
())();
對比一下兩段**:var a = 2; 這句**被拆分成兩部分:宣告var a ; 和 定義a = 2;而宣告部分被提公升了,到了**塊的前面,執行的時候自己挪到前面了,這就是「變數提公升「,結果就是:先執行宣告,接著就執行alert(a);變數a只是宣告還沒定義,就彈出了undefined了。
那麼,用let關鍵字在**塊就不會被提公升了嗎? 確定以及肯定。
var a = 1;
(function
())(); // 結果:報錯a未定義
那為什麼又報錯了呢,因為用let宣告的變數,在其塊級作用域內是封閉的,是不會受到外面的全域性變數a影響的,並且要先宣告再使用,所以a的值即不是1(因為不受外面的影響),也不是undefined(因為先宣告後使用),更不是2,未宣告定義就使用,那只有報錯了。
注意:let關鍵字要記得先宣告定義再使用。
3.使用let 其它注意點
(1) 同乙個塊級作用域內,不允許重複宣告同乙個變數。
錯誤例項:
(2) 函式內不能用let重新宣告函式的引數function
say(name)
say('wang');
say()函式內用let重新宣告了name這個引數,no!
小結:用 let 宣告變數只在塊級作用域起作用,適合在 for 迴圈使用,也不會出現變數提公升現象。同乙個**塊內,不可重複宣告的相同變數,不可重複宣告函式內的引數。
後續更新…
ES6語法 let 和 const 關鍵字
我們以前都是使用 var 關鍵字來宣告變數的。在 es6 的時候,多了兩個關鍵字 let 和 const 也是用來宣告變數的只不過和 var 有一些區別。使用 var 的時候重複宣告變數是沒問題的,只不過就是後的會把前面覆蓋掉 var num 100 var num 200通過let宣告變數,之前的...
es6之let,const關鍵字
在es5中沒有塊級作用域,只有函式作用域和全域性作用域,例如不能成為乙個作用域,但在es6中可以 for var i 0 i 4 i console.log i i 4這是因為i是在全域性的,最後列印的是for迴圈裡面最後的結果。用let替換var則結果為not defined。for let i ...
ES6之關鍵字const
const是constant 常量 的縮寫,const和 let一樣,也是用來宣告變數的,但是const是專門用於宣告乙個常量的,顧名思義,常量的值是不可改變的。const的特點 1 不可更改 1 2 const name 張三 name 李四 錯誤,企圖修改常量name 2 只在塊級作用域起作用,...