0%

JS核心-(60)-ES6 章節:Let 及 Const-Let 有沒有 Hoisting?暫時性死區介紹

前言

探討 Let 有沒有 Hoisting

Hoisting

提升 (hoisting) 簡單來說分為創造以及執行的兩個階段

那麼 let 有沒有類似這樣的狀態呢?

console.log(odin);

let odin = 'husky';

可以看到這樣狀況回給我們的是錯誤的訊息,並且告訴我們在還沒有宣告之前,沒有辦法針對這個變數進行調用。

那我們在修改一下程式碼改變情境:

console.log(odin);

let odin = 'husky';

{
    console.log(odin);
    // 如果沒有提升的話,照理說應該可以取得外層的結果(husky)

    let odin = 'dog';
}

一樣跳出一個錯誤,沒有辦法在初始化之前取得 odin 這個變數。

其實實際上的狀況是這樣, let 也有類似提升的概念,但提升完之後,會有一個暫時性死區的階段,跟一般的提升不同,

一般的提升會先給予變數 undefined 的狀態。但如果在暫時性死區的時候針對變數進行調用,就會報錯。

{
    // 創造
    let odin;

    // 暫時性死區 TDZ

    // 執行
    console.log(odin);
    let odin = 'dog';
}

總結觀念

  • let 一樣會有創造階段
  • 但從創造到實際宣告的階段會出現 TDZ,這個區域無法呼叫變數
  • 有創造到執行的概念,但不會預先出現 undefined 而是出現錯誤訊息提示
  • 文件不會表明這與 varHoisting 相同

再來看看一些程式碼

console.log(typeof a);
console.log(typeof myName);

let myName = '';

當我們利用 typeof 針對 not define 的變數進行檢查的時候,會出現 undefined

但針對 let 宣告的變數還是依然會報錯,也就是說還是在暫時性死區中調用該變數,所以系統進行報錯。