为什么函数语句需要一个名字?

时间:2011-11-10 21:40:12

标签: javascript

为什么我可以写

 var foo = function(){}();

但不能

 function(){}();

有任何设计原因吗?

3 个答案:

答案 0 :(得分:36)

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

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

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

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

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

另见When do I use parenthesis and when do I not?

答案 1 :(得分:7)

您可以(function(){})();,而不是在var foo = function(){}();

中命名该功能

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

答案 2 :(得分:1)

首次使用功能

var foo = function(){}()

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

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