Подтвердить что ты не робот

Почему оператор функции требует имя?

Почему я могу написать

 var foo = function(){}();

Но не может

 function(){}();

Есть ли какие-либо конструктивные причины?

4b9b3361

Ответ 1

Первый пример - это присваивание: правая часть является выражением, и немедленное выполнение анонимной функции имеет смысл.

Второй пример - объявление : как только закрывается "}", объявление заканчивается. Пары сами по себе не имеют смысла - они должны содержать выражение. Конечная ")" является ошибкой.

Автономные объявления должны быть преобразованы в выражения:

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

Первое делает объявление выражением, а затем выполняет результат. Второй превращает оба объявления и выполнение в выражение.

См. также Когда я использую скобки, а когда нет?

Ответ 2

Вы можете (function(){})();, и вы не называете функцию в: var foo = function(){}();

Вы устанавливаете foo в возвращаемое значение функции, которая в вашем случае undefined, потому что все функции возвращают что-то в JavaScript.

Ответ 3

Первое использование функции

var foo = function(){}()

находится в позиции выражения, а не в позиции оператора. Второй, с другой стороны, находится на верхнем уровне и работает как оператор функции. То есть, "функция" может использоваться в двух разных контекстах, и это может означать несколько разные вещи.

Если вы хотите сделать анонимные функции без имен, вы делаете это с помощью выражения функции. И только из-за того, как работает грамматика языка JavaScript, вам понадобятся парсеры в определенном контексте, как упоминает Дейв Ньютон, потому что место, где вы помещаете слово "функция", можно путать со своей версией оператора (что требует имя).