承上篇
接下來看看函式的 Hoisting~主要分成兩種情況:
1.函式宣告 (function declaration)
sayHi();
function sayHi() {
console.log("Hi!");
}
a. 創建期:
JS 先掃描整個程式碼,發現有一個 function sayHi() 宣告。
和 var 不同的是,整個函式的內容(包括裡面的程式碼)都會被一起放入記憶體中。換句話說,在創建期就已經知道「sayHi 是一個完整的可呼叫函式」。
b. 執行期:
- 執行第一行:sayHi(); → 因為函式已經在創建期被完整初始化,所以可以直接呼叫。
- 執行函式內容:輸出 "Hi!"。
2.函式表達式 (function expression)
var 宣告函式表達式
sayHi();
var sayHi = function() {
console.log("Hi!");
};
a. 創建期:
JS 先掃描到 var sayHi,只會先建立名稱並初始化為 undefined。
b. 執行期:
執行 sayHi(); → 因為此時 sayHi 是 undefined,所以試圖呼叫它會報錯:TypeError: sayHi is not a function。
let 或 const 宣告函式表達式
sayHi();
let sayHi = function() {
console.log("Hi!");
};
a. 創建期:
JS 掃描到 let sayHi,只登記名稱但不初始化 → 進入 TDZ。
b. 執行期:
執行 sayHi(); → 因為變數還在 TDZ → 拋出 ReferenceError。
簡單整理一下: