SyntaxError: function statement requires a name

JavaScript の例外 "function statement requires a name" は、名前が必要な関数文がコードの中にあった場合に発生します。

エラーメッセージ

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

エラーの種類

エラーの原因

コードに名前が必要な関数文があります。 関数がどのように定義されているか、関数の名前を指定する必要があるかどうか、または問題の関数が関数式、IIFE である必要があるかどうか、 コードがこのコンテキストに正しく置かれているかどうかを確認する必要があります。

文と式

function 文 (または function 宣言)では名前が必要であり、次のものは動作しません。

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

代わりに、function 式 (代入)を使用することができます。

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

関連項目