Javascript 为什么函数语句需要名称?

Javascript 为什么函数语句需要名称?,javascript,Javascript,为什么我会写 var foo = function(){}(); 但不能 function(){}(); 有什么设计原因吗?第一个例子是赋值:右边是表达式,立即执行匿名函数是有意义的 第二个例子是一个声明:一旦点击了关闭的“}”,声明就结束了。paren本身没有意义——它们必须包含一个表达式。尾随的“””是一个错误 独立声明必须转换为表达式: (function() {})(); // Or... (function() {}()); 首先将声明作为表达式,然后执行结果。第二种方法将

为什么我会写

 var foo = function(){}();
但不能

 function(){}();

有什么设计原因吗?

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

第二个例子是一个声明:一旦点击了关闭的
“}”
,声明就结束了。paren本身没有意义——它们必须包含一个表达式。尾随的“
””
是一个错误

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

(function() {})();  // Or...
(function() {}());
首先将声明作为表达式,然后执行结果。第二种方法将声明和执行都转换为表达式

另请参见您可以
(function(){})(),并且您没有在中命名函数:
var foo=function(){}()

您正在将
foo
设置为函数的返回值,在本例中,该函数是
未定义的
,因为所有函数都返回JavaScript格式的内容。

函数的第一次使用

处于表达式位置,而不是语句位置。另一方面,第二个位于顶层,用作函数语句。也就是说,“函数”可以在两种不同的上下文中使用,它可以表示微妙不同的事物


如果要生成没有名称的匿名函数,可以使用函数表达式。而且,正如Dave Newton所提到的,正是由于JavaScript语言语法的工作方式,在特定的上下文中,您需要使用paren,因为您放置单词“function”的位置可能会与其语句版本(需要名称)混淆。

函数声明与函数语句,重复项已经存在。您也可以执行
(function(){}())@Rocket-Hmm;同样的原因,我假设——它是作为一个表达式而不是声明开始的。我想我其实更喜欢这种语法,从来没有想过要尝试!JSLint更喜欢
(function(){}())语法。@那么我和jslint一样聪明。减去JS技能。
var foo = function(){}()