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

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

为什么这个:

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

和这个:

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

作品,而这个:

 function () { //code }(); 

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

更新 :感谢大家的答案! 所以这是关于函数expression与函数声明 。 看到这个堆栈溢出答案 , ECMAScript标准第13节,这个伟大的文章: 命名函数expression式揭秘

回顾一下答案:

  1. 第一个片段被解释为一个expression式,因为应用了分组操作符() ,请参阅ECMAScript标准第11.1.6节。

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

  3. 第三个片段没有任何东西允许解释器读取函数作为一个expression式,所以它被认为是一个声明,没有一个标识符是无效的(Gecko让它通过,但它扼杀后面()分组操作符(如它认为)适用于什么)。

前两种情况显示函数expression式 ,并且可以出现在像( 1+1x*f(4) )这样的expression式出现的任何地方。 就像1+1如何评价为2 ,这些expression式评价为相应的函数。


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

尝试通过Funcion声明语句声明一个匿名函数并没有多大意义,否则没有人会在之后得到函数的引用。


你需要打开的原因(或者在前两种情况下, var x = like就是强制下一个位在expression式上下文中进行parsing(例如, var x = if ...你不能做var x = if ... ) 。如果你只是把这个function作为第一个被parsing的声明语句,你就不需要了。

前两个是一个叫做函数expression式的东西,这意味着它是内联的,并且被解释为JS代码运行。

第三个是函数声明,在代码编译时被解释。 由于它是在编译时被解释的,所以你不能立即运行它,因为它周围的其他代码都没有运行。

举个例子:

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

简而言之,任何时候如果没有任何前面的function这个词,它就是一个声明。 任何时候它的前面都是一个expression。

下面是一个简单的思路:如果function是行上的第一个关键字,parsing器将把行的其余部分解释为函数声明。 换句话说,它会认为你正在试图写这样的东西,就好像你已经忘记命名你的函数一样:

 function foo(){ // code } 

解决这个问题的方法是将整个函数封装在一些parens中,或者把它作为variables赋值的一部分。 在任何一种情况下,你都把function放在线上,并允许parsing器识别你没有写函数声明。

对于我来说,允许function出现在一行的开头,仍然区分函数expression式和函数声明似乎是微不足道的,但是我想在JavaScript第一次被devise的时候,它并不是那么微不足道。

匿名函数在Stack Overflow问题中解释得很清楚为什么你需要在同一行调用一个匿名函数?