iT邦幫忙

2025 iThome 鐵人賽

DAY 28
0
自我挑戰組

請問這是魔法嗎?前端轉職菜雞的修煉之路!系列 第 28

DAY 28 瀏覽目錄的魔法 - Hoisting (2) - function

  • 分享至 

  • xImage
  •  

承上篇

接下來看看函式的 Hoisting~主要分成兩種情況:

1.函式宣告 (function declaration)

sayHi();

function sayHi() {
  console.log("Hi!");
}

a. 創建期:
JS 先掃描整個程式碼,發現有一個 function sayHi() 宣告。
和 var 不同的是,整個函式的內容(包括裡面的程式碼)都會被一起放入記憶體中。換句話說,在創建期就已經知道「sayHi 是一個完整的可呼叫函式」。

b. 執行期:
- 執行第一行:sayHi(); → 因為函式已經在創建期被完整初始化,所以可以直接呼叫。
- 執行函式內容:輸出 "Hi!"。

2.函式表達式 (function expression)

  1. var 宣告函式表達式

    sayHi();
    
    var sayHi = function() {
      console.log("Hi!");
    };
    

    a. 創建期:
    JS 先掃描到 var sayHi,只會先建立名稱並初始化為 undefined。

    b. 執行期:
    執行 sayHi(); → 因為此時 sayHi 是 undefined,所以試圖呼叫它會報錯:TypeError: sayHi is not a function。

  2. let 或 const 宣告函式表達式

    sayHi();
    let sayHi = function() {
      console.log("Hi!");
    };
    

    a. 創建期:
    JS 掃描到 let sayHi,只登記名稱但不初始化 → 進入 TDZ。

    b. 執行期:
    執行 sayHi(); → 因為變數還在 TDZ → 拋出 ReferenceError。

簡單整理一下:

  1. 函式表達式的提升,就和前一篇中講到的變數提升邏輯一樣,取決於你是用 var、let 還是 const 來宣告。
  • 若用 var,在創建期只會先建立名稱並初始化為 undefined。
  • 若用 let 或 const,則只會被登記名稱,並進入暫時性死區 (TDZ),直到執行到那一行才初始化。
  1. 函式宣告的提升更「完整」。整個函式(包含內容)都會在創建期就被放入記憶體中,因此可以在程式宣告之前就直接呼叫該函式。

上一篇
DAY 27 瀏覽目錄的魔法 - Hoisting (1) - var、let、const
下一篇
DAY 29 從特例到預設的魔法 - Next.js 的 Server Side Render
系列文
請問這是魔法嗎?前端轉職菜雞的修煉之路!30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言