深入理解ES6之var,let,const區別

WYQ_XQ發表於2018-03-07

深入理解ES6之函式
深入理解ES6之物件
深入理解ES6之類
深入理解ES6之解構
深入理解ES6之Promise與非同步程式設計
深入理解ES6之模組

第一:塊級範圍內

var變數提升(不存在以下問題)
let塊級作用域,指定塊的外部無法訪問
const常量宣告塊級作用域,不會發生變數提升,宣告後不可以改變因此需要初始化.(對於一個物件而言不可改變是指引用不可變,內容可以改變相當於java的final關鍵字)
1:禁止重複宣告
2:暫時性死區
3:不在塊級作用域範圍內使用按照undefined處理

console.log(typeof value)//因為發生在塊級作用域外面,不會因為暫時性死區而崩潰 
if(true){
   let value = "blue"
}

第二:迴圈範圍內

1:let沒有任何問題
2:var迴圈中的使用

var funcs = [];
for(var i=0;i<10;i++){
  funcs.push(functiong(){console.log(i)})
}
func.forEach(function(func){
  func()
});

因為變數i在迴圈的每次迭代中都被共享了 因此最後呼叫後的值會是列印10此10
3:迴圈內的常量宣告
const在for迴圈中使用時第一次正常執行第二次i++時,會因為試圖修改常量報錯;
const能夠在for-in與for-of迴圈內工作,因為迴圈為每次迭代建立了一個新的變數繫結而不是去試圖修改已繫結的變數值。

第三:全域性範圍內

1:var會覆蓋掉之前存在的同名屬性,let和const不會汙染全域性屬性

總結:

預設情況下應該使用const,只有知道變數需要被改變時才使用let,這樣預期外的改動都可以算作是bug處理。

相關文章