本博文配合 阮一峰 《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
的前面三條 - 只有一次賦值機會,並且必須在宣告的時候立馬賦值