SyntaxError: function statement requires a name

當代碼中存在需要名稱的函式宣告時,會發生 JavaScript 異常“函式宣告需要一個名稱”。

訊息

SyntaxError: Function statements require a function name (V8-based)
SyntaxError: function statement requires a name (Firefox)
SyntaxError: Function statements must have a name. (Safari)

錯誤型別

SyntaxError

哪裡出錯了?

程式碼中存在需要名稱的函式宣告。你需要檢查函式是如何定義的,以及是否需要為其提供名稱,或者所討論的函式是否需要是函式表示式、IIFE,或者函式程式碼是否在此上下文中正確放置。

示例

語句 vs. 表示式

一個函式宣告(或函式定義)需要一個名稱。這不會起作用:

js
function () {
  return "Hello world";
}
// SyntaxError: function statement requires a name

你可以使用函式表示式(賦值)來代替:

js
const greet = function () {
  return "Hello world";
};

如果你的函式旨在成為IIFE(立即執行函式表示式,即一旦定義就執行的函式),你需要新增一些大括號:

js
(function () {
  // …
})();

帶標籤的函式

標籤與函式名稱是完全不同的特性。你不能將標籤用作函式名稱。

js
function Greeter() {
  german: function () {
    return "Moin";
  }
}
// SyntaxError: function statement requires a name

此外,帶標籤的函式宣告本身是一個已棄用的特性。請使用常規函式宣告。

js
function Greeter() {
  function german() {
    return "Moin";
  }
}

物件方法

如果你打算建立一個物件的方法,你需要建立一個物件。此時,function 關鍵字後不帶名稱的以下語法是有效的。

js
const greeter = {
  german: function () {
    return "Moin";
  },
};

你也可以使用方法語法

js
const greeter = {
  german() {
    return "Moin";
  },
};

回撥語法

另外,在使用回撥時檢查你的語法。大括號和逗號會很快讓人感到困惑。

js
promise.then(
  function () {
    console.log("success");
  });
  function () {
    console.log("error");
}
// SyntaxError: function statement requires a name

正確的方法是:

js
promise.then(
  function () {
    console.log("success");
  },
  function () {
    console.log("error");
  },
);

另見