Hoisting

所謂的輸出 undefined 而非輸出 Reference a is not defined > 稱為 hoisting

一般情況

// example 1
console.log(a) // ReferenceError: a is not defined
// 完全沒宣告 > 合理
// example 2
console.log(a) // undefined -> 下面的變數提升上來了
var a

// 想像成
var a
console.log(a) 
// example 3
console.log(a) // undefined -> 但有賦值,值並不會提升
var a = 5 

// 想像成
var a 
console.log(a)
a = 5

function 傳入參數的 hoisting

function 的 hoisting 優先權

如果沒有 hoisting

  • 變數一定要先宣告才能用 > ok

  • 一定要先宣告函式才能用 > not ok

  • 沒有辦法 function 互相呼叫

深度了解

文章連結:TechBridge 技術共筆部落格 - hoisting

剖析hoisting

  • 函數執行時,會產生所謂的EC(Execution context)環境,這環境會儲存這個 function 內所需要的所有資訊,這函數需要什麼就去 EX 拿就對了。

  • 每個 EC 有相對應的變數空間物件稱 VO(variable object),在內宣告的變數跟函式都會被加進去,如果有參數,那參數也會加到 VO 內

    • 對於 js 而言,var a = 10

      • 首先分成左半邊 var a > VO 去新增一個屬性叫做 a,如果沒有這個屬性,就讓它 undefined。

      • 再來看到右半邊 a = 10 > 去 VO 裡面找到 a 這個屬性,找到後設定為 10

        • 啊如果找不到,就利用 scope chain 向上找,如果找不到最後就拋錯

如果在VO 內,已經有這個屬性了,那值不會被覆寫掉

Temporal Dead Zone

所謂的「暫時性死區」,就是「提升之後」至「賦值之前」這段期間

for const & let

在 let & const 這兩個部分,也存在著 hoisting,只是結果與 var 不同

如果是 var > 會報 undefined

如果是 let or const > 會報 錯誤

而TDZ 是一種時間的概念

在執行時,如果這個變數還沒有被賦值,就是會報錯(const & let

而如果是 var 就是 undefined

Last updated

Was this helpful?