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

JavaScript анонимная функция немедленного вызова/выполнения (выражение против объявления)

Возможные дубликаты:
В чем разница между выражением функции и объявлением в JavaScript? Объяснить синтаксис анонимных функций, встроенный в JavaScript

Почему это:

(function () {
    //code
}());

и это:

var f = function () {
    //code
}();

работает, а это:

function () {
    //code
}();

нет? Он выглядит точно так же - анонимная функция определена и сразу же вызвана. Может ли кто-нибудь сделать цитату из стандарта JavaScript/ECMAScript, которая объясняет это?

ОБНОВЛЕНИЕ: Спасибо за ответы всем! Таким образом, это выражение выражения функции и объявления. См. этот ответ "Переполнение стека" , стандарт ECMAScript, и эта замечательная статья: Именованные функциональные выражения, демистифицированные.

Повторить ответы:

  • Первый фрагмент интерпретируется как выражение, потому что применяется оператор группировки () - см. стандарт ECMAScript 11.1.6.

  • Во втором фрагменте функция интерпретируется как выражение, потому что она находится в правой части оператора присваивания, =.

  • В третьем фрагменте нет ничего, что позволяет интерпретатору читать функцию как выражение, поэтому он считал объявление, которое является недопустимым без идентификатора (Gecko позволяет ему пройти, но он задыхается после () оператор группировки (как он думает) ни к чему не применим).

4b9b3361

Ответ 1

Первые два случая показывают выражения функций и могут появляться в любом месте, где появится выражение типа (1+1 или x*f(4)). Точно так же, как 1+1, оценивает значение 2, эти выражения оценивают соответствующую функцию.


Третий случай - это выражение выражения

Ответ 2

Первые два - это что-то, называемое выражением функции, означающее его встроенный и интерпретируемый как код JS.

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

Чтобы показать пример:

// foo == undefined
// bar == function

function bar(){ .. }
var foo = function(){ ... }

// foo == function
// bar == function

Проще говоря, в любое время, когда у вас есть слово function без чего-либо предшествующего ему, это объявление. В любое время что-то предшествует ему, это выражение.

Ответ 4

Вот простой способ подумать об этом: если function - это первое ключевое слово в строке, синтаксический анализатор интерпретирует остальную часть строки как объявление функции. Другими словами, он подумает, что вы пытаетесь написать что-то вроде этого, как будто вы забыли назвать свою функцию:

function foo(){ 
    // code
}

Способ обойти это - либо обернуть всю функцию внутри некоторых парнеров, либо сделать ее частью назначения переменной. В любом случае вы помещаете function назад в строку и позволяете синтаксическому анализатору распознавать, что вы не пишете объявление функции.

Мне кажется тривиальным, чтобы позволить function появляться в начале строки и по-прежнему различать выражения функций и объявления функций, но я думаю, что это было не так тривиально, когда JavaScript был впервые разработан.