关于javascript:为什么函数语句需要一个名字?

Why function statement requires a name?

为什么我可以写

1
 var foo = function(){}();

但不能

1
 function(){}();

有任何设计原因吗?


第一个例子是赋值:右侧是表达式,匿名函数的立即执行是有意义的。

第二个例子是一个声明:一旦结束"}",声明就结束了。 Parens本身没有意义 - 它们必须包含一个表达。尾部")"是一个错误。

必须将独立声明转换为表达式:

1
2
(function() {})();  // Or...
(function() {}());

第一个使声明成为表达式,然后执行结果。第二个将声明和执行转换为表达式。

另请参见何时使用括号,何时不使用括号?


您可以(function(){})();,而不是在var foo = function(){}();中命名该函数

您将foo设置为函数的返回值,在您的情况下是undefined,因为所有函数都返回JavaScript中的内容。


第一次使用功能

1
var foo = function(){}()

处于表达位置,而不是陈述位置。另一方面,第二个位于顶层,作为函数声明。也就是说,'function'可以在两个不同的上下文中使用,它可能意味着微妙的不同。

如果要创建没有名称的匿名函数,可以使用函数表达式。而且,正如JavaScript语言语法的工作原理一样,你需要在某些语境中使用parens,正如Dave Newton所提到的那样,因为你将"function"这个词放在哪里可以与它的语句版本混淆(这确实需要一个名字)。