Hoisting
所謂的輸出 undefined 而非輸出 Reference a is not defined > 稱為 hoisting
一般情況
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