SyntaxError: function statement requires a name

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

エラーメッセージ

Syntax Error: Expected identifier (Edge)
SyntaxError: function statement requires a name [Firefox]
SyntaxError: Unexpected token ( [Chrome]

エラーの種類

何がうまくいかなかったのか?

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

文と式

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

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

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

var greet = function() {
  return 'Hello world';
};

または、定義するとすぐに実行される IIFE (即時実行関数式) を定義しようとしているのかもしれません。その場合は、もう少々括弧が必要です。

(function () {

})();

ラベル付けされた関数

関数 label を使用している場合、function キーワードの後に関数名を指定する必要があります。これは動作しません:

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

たとえば、これは動作します。

function Greeter() {
  german: function g() {
    return "Moin";
  }
}

オブジェクトのメソッド

オブジェクトのメソッドを作るならば、オブジェクトを作る必要があります。その場合、function キーワードの後に名前がない次の構文は有効です。

var greeter = {
  german: function () {
    return "Moin";
  }
};

コールバック構文

コールバックを使用するときの構文もチェックします。大括弧とカンマが混同しやすいです。

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

正しくは、次の通りです。

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

関連項目