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


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

почему это:

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

и так:

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

работает, в то время как это:

function () {
    //code
}();

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

обновление: Спасибо за ответы всем! Так что это о выражение функции против объявления функции. См. этот ответ переполнения стека, стандарт ECMAScript раздел 13, и эта большая статья:именованные функциональные выражения демистифицированный.

чтобы резюмировать ответы:

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

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

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

4 56

4 ответа:

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


третий случай-это функция declation сообщении, и может появиться в любом месте вы можете иметь другие заявления (например,if или while заявления).

там не так много смысла пытаться объявить анонимную функцию с помощью операторов объявления Funcion, так как в противном случае никто не получит ссылку на функцию впоследствии.


причина, по которой вам нужно Открытие ( или var x = как и в первых двух случаях, они заставляют следующий бит анализироваться в контексте выражения. (только подумайте, как вы не можете сделать var x = if ..., например). Если вы просто поставите function как первое, что будет разбираться как декларации заявление ты не хочешь.

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

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

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

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

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

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

проще говоря, в любое время у вас слово function без чего-либо предшествующего, это a декларация. Каждый раз, когда что-то предшествует этому, это выражение.

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

function foo(){ 
    // code
}

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

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

анонимные функции хорошо объясняются в переполнении стека вопрос зачем вам нужно вызывать анонимную функцию в той же строке?.