可能重复:
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 answer,ECMAScript standard第13条和这篇精彩的文章: Named function expressions demystified 。
回顾一下答案:
第一个代码段被解释为表达式,因为已应用分组运算符()
- 请参阅ECMAScript standard第11.1.6节。
在第二个片段中,该函数被解释为表达式,因为它位于赋值运算符=
的右侧部分。
第三个片段没有任何允许解释器将函数作为表达式读取的东西,因此它被认为是一个声明,如果没有标识符则无效(Gecko允许它通过但是它会在下面扼杀()
分组运算符(因为它认为)应用于任何东西)。
答案 0 :(得分:20)
前两个案例显示函数表达式,并且可以出现像(1+1
或x*f(4)
)这样的表达式。就像1+1
计算2
一样,这些表达式会计算出相应的函数。
第三种情况是函数declation 语句 ,并且可以出现在任何可以包含其他语句的位置(例如if
或while
语句)。
尝试通过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第一次出现时它并不是那么简单。设计的。