为什么函数声明需要一个名称?

30

为什么我可以写

 var foo = function(){}();

无法完成

 function(){}();

有没有任何设计原因?


2
函数声明与函数语句,重复已经存在。 - Rob W
可能是解释JavaScript封装的匿名函数语法的重复问题。 - Rob W
3个回答

44

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

第二个例子是一次声明:一旦遇到闭合的"}",声明就结束了。单独使用圆括号没有意义--它们必须包含一个表达式。最后的")"是一个错误。

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

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

第一个将声明变为表达式,然后执行结果。第二个将声明和执行都变成了表达式。

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


你也可以使用(function(){}()); - gen_Eric
1
@Rocket 嗯,我想是同样的原因——它作为表达式开始而不是声明。 我觉得我实际上更喜欢那种语法,从来没有想过尝试过这样做! - Dave Newton
JSLint 更喜欢 (function(){}()); 语法。 - gen_Eric
1
@Rocket 那我和 jslint 一样聪明。只是没有 JS 技能。 - Dave Newton

7

你可以使用(function(){})();,并且在var foo = function(){}();中不需要给函数命名。

你将foo设置为函数的返回值,而在你的情况下,这个返回值是undefined,因为在JavaScript中所有的函数都会返回一些东西。


2
第一次使用 函数
var foo = function(){}()

第一个代码块中的'function'在表达式位置,而不是声明位置。另一方面,第二个代码块在顶层工作,作为函数声明。也就是说,'function'可以在两个不同的上下文中使用,并且可能有微妙的不同含义。

如果您想创建没有名称的匿名函数,则需要使用函数表达式。由于JavaScript语言语法的工作方式,根据Dave Newton的提醒,在某些情况下需要使用括号,因为放置'function'单词的位置可能会与其声明版本混淆(这需要一个名称)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接