在ES6以前並無let、const、block scope(區塊作用域,可以當成{})的概念,當時都是使用var來宣告變數, 雖然這樣宣告起來很方便,但是往往會有忽略宣告變數的層級問題,導致全域環境受到汙染的狀況, 以下將會舉例來作簡單的解釋。

var

宣告在function內的var變數只在function(function scope)內有效。

宣告在function外的話其作用範圍將會是全域作用域(global scope)。

var i = "aaa";//定義一個全域i變數的字串"aaa"

for(var i=0; i<3; i++){//透過一些區塊語句處理後將會影響到原有的全域變數
  console.log(i,"a");
}
console.log(i);// 3

可以輸入window來檢驗上述所說的, 在function scope以外的地方宣告var變數, 其作用於全域作用域(global scope),如同上面的例子 當有重複命名或沒規劃好變數作用範圍之類的情況時將會汙染全域環境

let

用let來宣告變數其作用的區域為區塊作用域(block scope),可以當作大括號{}內的範圍為一個區塊。

在區塊作用域(大括號{})以外的地方將存取不了該變數,將出現is not defined的錯誤。

for(let i=0; i<3; i++){//區塊內的let i
  console.log(i);
}

//區塊外存取let i
console.log(i);// error: i is not defined
  1. let不會產生全域變數且在同一個區塊(block)
  2. let不能重複宣告(包含var同名變數宣告也不行),否則會出錯 Identifier ‘i’ has already been declared

const

具備let所有的特性。 但是除了與let相同以外,const所有的特性又有額外的規範。

  1. 宣告時就要為其賦值
  2. 有常數的特性(即不可修改)