scope 是變數可以被取用的區域
這是 ES6 新增的宣告方式,它很像 var
,又有些不同
console.log(c)
let c = true;
console.log(c)
在創造階段,一樣會初始化給予 undefind
,差別的地方在於,如果在宣告 let c
想要取用 c
的話,引擎不讓你用,會報下面的錯誤:
> Uncaught ReferenceError: Cannot access 'c' before initialization
有些人可能會以為 let 沒有 hoisting,但其實還是有的,還是會初始化 undefind,只是會有 Temporal Dead Zone
它讓 javascript 引擎使用了一個叫區塊範圍(block scoping)的東西。
這個區塊只要在大括號 {}
的範圍內都算,包括函數、if、for,例如在 for 迴圈內宣告變數,那每一圈的存放該變數的記憶體都不同
另外,當變數被宣告在區塊中,就只有該區塊可以使用。
其實 ES6 的東西在本課程提到的不多(甚至 const 都沒提到),或許是因為 這堂課 推出的時間在 2015 ,那時 ES6 還沒正式推出。
所以我也沒有寫太多,因為我還是先專注在課堂上,我希望之後自己在寫專門的文章來介紹。
在這之前,特別推薦 Huli 寫的這篇 我知道你懂 hoisting,可是你了解到多深?,可以了解 const、let 和 hoisting 的關係,寫得非常清楚。
至於 const、let 和 var 的差異,我想 MDN 上也寫得很清楚。