Почему функция() {} не работает, но (функция() {}) делает? (Chrome DevTools/Node)

Я видел это странное поведение прямо сейчас, когда я не мог определить

function(){} 

или

function(a){
   console.log(a)
}

Он выдает Uncaught SyntaxError.

Но test = function(){} или (function(){}) действительно работали.

У инструментов Safari dev есть лучший отчет об ошибке: он говорит

SyntaxError: Операторы функций должны иметь имя.

Хорошо, нет смысла определять такую ​​функцию, если вы никогда не будете ее использовать. Но все еще странно. Наверное, я уже ответил на этот вопрос.

Ответы

Ответ 1

JavaScript имеет объявления функций и выражения функций. Первое не может быть немедленно вызвано, в то время как последнее может. Это вопрос языковой грамматики.

Объявление функции:

function foo() {
    // ...
}

Функциональное выражение (в правой части =):

var foo = function() {
    // ...
};

Добавляя круглые скобки вокруг функции, вы заставляете эту функцию анализироваться как выражение функции, потому что невозможно поставить объявление функции в круглые скобки (где ожидаются и принимаются только выражения):

(function foo() {
    // ...
});

Вы можете сразу вызвать его:

(function foo() {
    // ...
})();

Для более детальной записи проверьте Определения функций в JavaScript.

Ответ 2

Скобки в (function(){}) означают, что функция оценивает, объект теперь содержится внутри скобок, и эта оценка возвращает функцию. Его можно вызвать, например: (function(){})();.

function(){} не оценивается. Для этого имеет смысл вызвать ошибку, потому что, как вы сказали, вы не сможете ее использовать каким-либо образом.