前言
探討 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而是出現錯誤訊息提示 - 文件不會表明這與
var的Hoisting相同
再來看看一些程式碼
console.log(typeof a);
console.log(typeof myName);
let myName = '';
當我們利用 typeof 針對 not define 的變數進行檢查的時候,會出現 undefined
但針對 let 宣告的變數還是依然會報錯,也就是說還是在暫時性死區中調用該變數,所以系統進行報錯。