为什么我可以写
var foo = function(){}();
但不能
function(){}();
有任何设计原因吗?
答案 0 :(得分:36)
第一个例子是赋值:右边是一个表达式,并且立即执行匿名函数是有意义的。
第二个例子是声明:一旦结束"}"
,声明就结束了。 Parens自己不有意义 - 它们必须包含一个表达式。尾随")"
是一个错误。
独立声明必须转换为表达式:
(function() {})(); // Or...
(function() {}());
第一个使声明成为表达式,然后执行结果。第二个将声明和执行转换为表达式。
答案 1 :(得分:7)
您可以(function(){})();
,而不是在var foo = function(){}();
您正在将foo
设置为函数的返回值,在您的情况下为undefined
,因为所有函数都返回JavaScript中的内容。
答案 2 :(得分:1)
首次使用功能
var foo = function(){}()
处于表达位置,而不是语句位置。另一方面,第二个位于顶层,作为函数声明。也就是说,'function'可以在两个不同的上下文中使用,它可能意味着微妙的不同。
如果要创建没有名称的匿名函数,可以使用函数表达式。而且,正如JavaScript语言语法的工作原理一样,你需要在某些语境中使用parens,正如Dave Newton所提到的那样,因为你将“function”这个词放在哪里可以与它的语句版本混淆(这确实需要一个名字)。