【问题标题】:Why function statement requires a name?为什么函数语句需要名称?
【发布时间】:2011-12-26 13:35:57
【问题描述】:

为什么我会写作

 var foo = function(){}();

但不能

 function(){}();

有什么设计原因吗?

【问题讨论】:

标签: javascript


【解决方案1】:

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

第二个例子是一个声明:一旦关闭"}"被击中,声明就结束了。 Parens 本身有意义——它们必须包含一个表达式。结尾的 ")" 是一个错误。

独立的声明必须变成表达式:

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

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

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

【讨论】:

  • 你也可以(function(){}());
  • @Rocket 嗯;同样的原因,我假设——它是作为一个表达式而不是声明开始的。我想我实际上更喜欢这种语法,从来没有想过要尝试!
  • JSLint 更喜欢 (function(){}()); 语法。
  • @Rocket 那我和jslint一样聪明。减去 JS 技能。
【解决方案2】:

您可以(function(){})();,但您没有将函数命名为:var foo = function(){}();

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

【讨论】:

    【解决方案3】:

    函数的第一次使用

    var foo = function(){}()
    

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

    如果你想创建没有名字的匿名函数,你可以使用函数表达式。而且,正如 Dave Newton 所提到的,仅仅因为 JavaScript 语言语法的工作方式,您需要在特定上下文中使用括号,因为您放置“函数”一词的位置可能会与其语句版本混淆(这确实需要一个名字)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 2021-11-07
      • 2013-10-23
      相关资源
      最近更新 更多