[進階 js 07] Temporal Dead Zone


Posted by tzutzu858 on 2021-03-24

這邊要來講 let 跟 const 與 hoisting
先複習一下 hoisting

console.log(a)
var a = 10

答案會是 undefined

但如果是用 let

console.log(a)
let a = 10

答案會是 ReferenceError : a is not defined,換成 const 也是一樣
那 let 是不是沒有 hoisting ?

但看以下範例

let a = 10
function test() {
    console.log(a)
    let a = 30
}

test()

如果沒有 hoisting 那 a 應該就會是 10
如果有 hoisting,那 let a = 30 應該會被提升,而 log 出來的 a 就會是 undefined
但出來的結果卻還是一樣 ReferenceError : a is not defined

那到底 let 跟 const 有沒有 hoisting

先講結果: 答案是有的
因為上面例子,如果沒有 hoisting 那 a 應該就會是 10

但 let 跟 const 的 hoisting,底層運作不太一樣

以上面例子可以看成下面這樣

let a = 10
function test() {
    let a
    console.log(a)
    a = 30
}

test()

let 跟 const 和 variable 不一樣的地方 : TDZ:Temporal Dead Zone

用 let 跟 const 直到執行 a = 30 這行以前,都不能去存取 a
一旦去存取 a ,就會出現 ReferenceError
所以從進入 function test 開始
提升之後以及 a賦值之前的這段期間就叫 TDZ:Temporal Dead Zone
中文有的翻譯叫做暫時性死區
所以在這 Temporal Dead Zone 存取就會出現錯誤

總結 : let 與 const 也有 hoisting 但沒有初始化為 undefined,而且在賦值之前試圖取值會發生錯誤。

Huli 文章複習 : 我知道你懂 hoisting,可是你了解到多深?










Related Posts

VMware Esxi 8 安裝 Ubuntu 紀錄

VMware Esxi 8 安裝 Ubuntu 紀錄

D47_W6HW1

D47_W6HW1

MTR04_0927

MTR04_0927


Comments