SyntaxError: function statement requires a name

메세지

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

에러 타입

무엇이 잘못되었을까?

함수 구문(Function statement)은 이름이 필수입니다. 함수가 정의된 방법에 따라 함수의 이름을 짓거나 함수 표현식(Function expression) IIFE으로 작성하거나, 함수가 맥락에 맞게 제대로 작성되었는지 확인해야 합니다.

예제

구문 vs 표현식

함수 구문(또는 함수 선언)은 이름이 필요하므로 아래 예제는 동작하지 않습니다:

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

대신 함수 표현식을 사용할 수 있습니다:

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

또는, 선언하자마자 바로 실행되는 IIFE (Immediately Invoked Function Expression)를 사용할 수 있습니다. 이 경우 몇 개의 괄호가 더 필요합니다:

js
(function () {})();

레이블을 붙인 함수

만약 함수 레이블을 사용하는 경우 function 키워드 뒤에 함수 이름이 필요하므로 아래 예제는 동작하지 않습니다:

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

아래 예제는 동작합니다:

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

객체 메소드

만약 객체 메소드를 만드는 경우 먼저 객체를 만들어야 합니다. 객체 메소드의 경우 아래 예제와 같이 function 키워드 뒤에 이름이 없어도 정상적으로 동작합니다.

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

콜백 구문

콜백을 사용하는 경우 구문을 확인해야 합니다. 괄호와 쉼표는 구문을 어렵게 만듭니다.

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

올바르게 변경하면:

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

같이 보기