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");
  },
);

另见