函式宣告與函式表示式有什麼區別?

王铁柱6發表於2024-11-25

在 JavaScript 中,函式宣告和函式表示式都是建立函式的方式,但它們之間有一些關鍵的區別:

1. 語法 (Syntax):

  • 函式宣告 (Function Declaration):

    function myFunction(param1, param2) {
        // 函式體
    }
    
  • 函式表示式 (Function Expression):

    const myFunction = function(param1, param2) {
        // 函式體
    }; // 注意這裡有分號
    
    // 也可以使用箭頭函式形式:
    const myFunction = (param1, param2) => {
        // 函式體
    };
    

2. 提升 (Hoisting):

  • 函式宣告: 會被“提升”到作用域的頂部。這意味著你可以在宣告函式 之前 呼叫它。

    myFunction(); // 可以呼叫,即使函式宣告在後面
    
    function myFunction() {
        console.log("Hello");
    }
    
  • 函式表示式: 不會被提升。你必須在宣告函式表示式 之後 才能呼叫它。

    myFunction(); //  報錯! Cannot access 'myFunction' before initialization
    
    const myFunction = function() {
        console.log("Hello");
    };
    

3. 命名函式表示式:

函式表示式可以是命名的,也可以是匿名的。

  • 匿名函式表示式: 如上面的例子,函式沒有名字。

  • 命名函式表示式: 函式表示式可以有一個名字,這在遞迴或除錯時很有用。 這個名字只在函式內部作用域可見。

    const factorial = function fact(n) { // fact 是函式名,僅在函式內部作用域可見
        return n <= 1 ? 1 : n * fact(n - 1);
    };
    

4. 使用場景:

  • 函式宣告: 通常用於定義獨立的、可複用的函式。由於提升的特性,它們更適合在程式碼的頂部宣告,以便在任何地方呼叫。

  • 函式表示式: 更靈活,常用於將函式作為引數傳遞給其他函式(回撥函式)、建立閉包、以及在需要函式的地方直接定義函式。

總結:

特性 函式宣告 函式表示式
語法 function name() {} const name = function() {};const name = () => {};
提升 會被提升 不會被提升
命名 必須命名 可以匿名或命名(命名僅在函式內部作用域可見)
使用場景 獨立的、可複用的函式 回撥函式、閉包、需要函式的地方直接定義

希望這個解釋能夠幫助你理解函式宣告和函式表示式之間的區別。

相關文章