ES6 之 let / const

evenyao發表於2018-09-04

本博文配合 阮一峰 《ES6 標準入門(第3版)》一書進行簡要概述 ES6 中的 let 與 const。

歷史遺留問題

由於 JS ES3語法中的 var 提升變數、沒有塊級作用域,因而搞出來了一大波的 “副產品”,匿名立即執行函式、閉包,都是 ES3 JS 遺留下來的產物。
所以學過 C 和 Python 再來看 JS ,會感覺很奇怪。
因為 ES6 之前,沒有塊級作用域,只有通過立即執行函式+閉包的方式造一個區域性函式作用域。

let

let的出現解決了 JS 曾經沒有塊級作用域的問題,即終於在 JS 中出現了正常思維邏輯的語法糖… 即 {} 劃分作用域,要想使用變數,必須let宣告過該變數。

{
  let a = 1
  console.log(a)
}

 

如果在 {}外使用變數,就會報錯,因為let{}中宣告的是區域性變數,僅供這個塊級作用域使用。

{
  let a = 1
}
console.log(a)  //報錯

 

這難道不應該是正常的一種使用習慣麼?
然而經常使用 var ES3 語法的 JS 程式設計師反而會覺得這種用法奇怪 …

const

用法和let幾乎一致,唯一不同的是const只要一次賦值的機會。

{
  let a = 1
  console.log(a)  //1
  a = 2
  console.log(a)  //2
}
{
  const a = 1
  console.log(a)  //1
  a = 2
  console.log(a)  //報錯
}

 

總結

let

  • let的作用域在最近的{}之間
  • 如果在定義變數 let a 之前使用變數 a,那麼報錯
  • 如果重複定義let a,那麼報錯

const

  • 包含let的前面三條
  • 只有一次賦值機會,並且必須在宣告的時候立馬賦值

相關文章