Почему функция() {} не работает, но (функция() {}) делает? (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(){}
не оценивается. Для этого имеет смысл вызвать ошибку, потому что, как вы сказали, вы не сможете ее использовать каким-либо образом.