Skip to main content

函式宣告式與 函式表達式

一、定義差異

類型語法範例提升(Hoisting)行為
函式宣告式(Function Declaration)function greet() { ... }整個函式會被提升
函式表達式(Function Expression)const greet = function () { ... }只有變數名稱提升,值為 undefined(或暫時性死區)

二、比喻記憶法

函式宣告式就像到戶政事務所報戶口,從一開始(建立階段)就會有完整的身分資料,因此可以在宣告前就被呼叫。

函式表達式就像幫變數取綽號,變數名稱先存在,但內容(函式)是後來才賦值的,因此在賦值前不能呼叫。


三、記憶口訣(台灣常用語法)

  • 函式宣告式:先報戶口,隨時找得到

  • 函式表達式:先有名字,內涵後面才知道


四、範例對照

函式宣告式

sayHi(); // 可正常執行

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

函式表達式

sayHi(); // 錯誤:Cannot access 'sayHi' before initialization

const sayHi = function () {
console.log("嗨嗨!");
};

五、三個差別關鍵

比較項目函式宣告式函式表達式
關鍵字function 名稱()const 變數 = function()
提升行為會整個提升只有變數名稱提升,值尚未定義
呼叫時機宣告前就可以用宣告後才能用

六、補充:箭頭函式也是表達式

const sayHi = () => {
console.log("嗨嗨!");
};

箭頭函式屬於函式表達式的一種,因此同樣具有「不能在宣告前呼叫」的限制。