在 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 = () => {}; |
提升 | 會被提升 | 不會被提升 |
命名 | 必須命名 | 可以匿名或命名(命名僅在函式內部作用域可見) |
使用場景 | 獨立的、可複用的函式 | 回撥函式、閉包、需要函式的地方直接定義 |
希望這個解釋能夠幫助你理解函式宣告和函式表示式之間的區別。