JavaScript匿名函数立即调用/执行(表达式与声明)

lxa*_*lxa 58 javascript anonymous-function

可能的重复:
JavaScript中的函数表达式与声明之间有什么区别?
解释JavaScript封装的匿名函数语法

为什么这个:

(function () {
    //code
}());
Run Code Online (Sandbox Code Playgroud)

还有这个:

var f = function () {
    //code
}();
Run Code Online (Sandbox Code Playgroud)

工作,而这:

function () {
    //code
}();
Run Code Online (Sandbox Code Playgroud)

才不是?它看起来完全一样 - 定义了匿名函数,并立即调用.有人可以从JavaScript/ECMAScript标准中引用它来解释这个吗?

更新:感谢大家的答案!所以这是关于函数表达式与函数声明的关系.请参阅此Stack Overflow答案,ECMAScript标准第13节,以及这篇精彩文章:命名函数表达式揭秘.

回顾一下答案:

  1. 第一个片段被解释为表达式,因为应用了分组运算符()- 请参阅ECMAScript标准第11.1.6节.

  2. 在第二个片段中,函数被解释为表达式,因为它位于赋值运算符的右侧部分=.

  3. 第三个片段没有任何允许解释器将函数作为表达式读取的东西,因此它被认为是一个声明,如果没有标识符则无效(Gecko允许它通过,但它会跟随下面的()分组操作符(因为它认为) )什么都不适用).

hug*_*omg 21

前两个案例显示函数表达式,并且可以出现像(1+1x*f(4))这样的表达式出现的任何位置.就像1+1评估一样2,这些表达式如何评估相应的函数.


第三种情况是函数declation 语句,可以出现在任何可以有其他语句的地方(比如一个ifwhile语句).

试图通过Funcion声明语句声明一个匿名函数没有太大意义,因为否则之后没有人会得到对该函数的引用.


你需要开的原因(var x =在在前两种情况下一样的是,他们迫使下位表达式上下文来解析.(只是想想你怎么做var x = if ...,例如).如果您只是将它function作为第一个被解析为您不想要的声明语句.