JavaScript匿名函数立即调用/执行(expression式与声明)
可能重复:
JavaScript中的函数expression式与声明之间有什么区别?
解释JavaScript封装的匿名函数语法
为什么这个:
(function () { //code }());
和这个:
var f = function () { //code }();
作品,而这个:
function () { //code }();
才不是? 它看起来完全一样 – 匿名函数定义,并立即调用。 有人可以从JavaScript / ECMAScript标准来解释这个标准吗?
更新 :感谢大家的答案! 所以这是关于函数expression与函数声明 。 看到这个堆栈溢出答案 , ECMAScript标准第13节,这个伟大的文章: 命名函数expression式揭秘 。
回顾一下答案:
-
第一个片段被解释为一个expression式,因为应用了分组操作符
()
,请参阅ECMAScript标准第11.1.6节。 -
在第二个片段中,函数被解释为一个expression式,因为它在赋值运算符右侧的部分
=
。 -
第三个片段没有任何东西允许解释器读取函数作为一个expression式,所以它被认为是一个声明,没有一个标识符是无效的(Gecko让它通过,但它扼杀后面
()
分组操作符(如它认为)适用于什么)。
前两种情况显示函数expression式 ,并且可以出现在像( 1+1
或x*f(4)
)这样的expression式出现的任何地方。 就像1+1
如何评价为2
,这些expression式评价为相应的函数。
第三种情况是一个函数声明 ,可以出现在任何你可以有其他语句的地方(如if
或while
语句)。
尝试通过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问题中解释得很清楚为什么你需要在同一行调用一个匿名函数? 。