函式宣告式與 函式表達式
一、定義差異
類型 | 語法範例 | 提升(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("嗨嗨!");
};
箭頭函式屬於函式表達式的一種,因此同樣具有「不能在宣告前呼叫」的限制。