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

时间:2011-07-16 17:39:50

标签: javascript anonymous-function

  

可能重复:
  What is the difference between a function expression vs declaration in JavaScript?
  Explain JavaScript's encapsulated anonymous function syntax

为什么:

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

和此:

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

有效,但是:

function () {
    //code
}();

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

更新:感谢大家的答案! 所以它是关于函数表达式与函数声明。请参阅this Stack Overflow answerECMAScript standard第13条和这篇精彩的文章: Named function expressions demystified

回顾一下答案:

  1. 第一个代码段被解释为表达式,因为已应用分组运算符() - 请参阅ECMAScript standard第11.1.6节。

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

  3. 第三个片段没有任何允许解释器将函数作为表达式读取的东西,因此它被认为是一个声明,如果没有标识符则无效(Gecko允许它通过但是它会在下面扼杀()分组运算符(因为它认为)应用于任何东西)。

4 个答案:

答案 0 :(得分:20)

前两个案例显示函数表达式,并且可以出现像(1+1x*f(4))这样的表达式。就像1+1计算2一样,这些表达式会计算出相应的函数。


第三种情况是函数declation 语句 ,并且可以出现在任何可以包含其他语句的位置(例如ifwhile语句)。

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


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

答案 1 :(得分:4)

前两个是一个叫做函数表达式的东西,意思是它内联并解释为JS代码运行。

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

举例:

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

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

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

简单地说,只要你有function这个词而没有任何先行词,它就是一个声明。任何时候事情发生之前,它都是表达。

答案 2 :(得分:0)

Stack Overflow中很好地解释了匿名函数 问题 Why do you need to invoke an anonymous function on the same line?

答案 3 :(得分:0)

这是一种思考它的简单方法:如果function是该行的第一个关键字,则解析器会将该行的其余部分解释为函数声明。换句话说,它会认为你正在尝试写这样的东西,好像你忘了给你的功能命名一样:

function foo(){ 
    // code
}

解决这个问题的方法是将整个函数包装在某些parens中,或者将其作为变量赋值的一部分。在任何一种情况下,你都会将function放回到行上并允许解析器识别你没有编写函数声明。

允许function出现在一行的开头并仍然区分函数表达式和函数声明对我来说似乎微不足道,但我想当JavaScript第一次出现时它并不是那么简单。设计的。