【问题标题】:Is there a difference between (function() {...}()); and (function() {...})();? [duplicate](function() {...}()); 之间有区别吗?和 (function() {...})();? [复制]
【发布时间】:2011-04-16 12:42:24
【问题描述】:

可能重复:
Location of parenthesis for auto-executing anonymous JavaScript functions?

有时我会看到:

(function() { ... }()); 

有时我会看到:

(function() { ... })(); 

我看到有和没有参数的两种形式。他们 both execute 匿名函数。

这两种形式有区别吗?是否有任何令人信服的理由使用一种形式而不是另一种形式?

【问题讨论】:

  • @Tim - 感谢您指出该线程。我没有用搜索找到它。
  • 让我们继续投票重复...
  • 乔希:CMS 的答案比任何副本都好,所以它带来了一些好处。
  • @Tim - 除非您以 @Josh 开头,否则 Josh 不会收到您的评论通知 ==> [ 评论回复如何工作? ](meta.stackexchange.com/questions/43019/…)
  • 哦!我没有意识到。尴尬。

标签: javascript anonymous-function


【解决方案1】:

这两种形式没有实际区别,但从语法的角度来看,两者之间的区别在于The Grouping Operator - 括号 - 在第一个示例中将包含@987654322 @,包括FunctionExpression

呼叫表达 | | 函数表达式 | | | 五五 (功能() { }()); ^ ^ |--主表达式--|

在第二个例子中,我们首先有一个完整的CallExpression,它包含FunctionExpression

主要表达 | 函数表达式 | 五 (功能() { })(); ^ ^ |-- 调用表达式--|

【讨论】:

    【解决方案2】:

    就编译器而言,两者之间没有区别。但是,会发现在 Douglas Crockford 的 JavaScript code conventions 中推荐使用 (function () {}()) 样式。

    【讨论】:

    • 更正:(function () {}());
    • 正如摩西所写的,看起来情况正好相反。来自该文本:When a function is to be invoked immediately, the entire invocation expression should be wrapped in parens so that it is clear that the value being produced is the result of the function and not the function itself....(function() { ... }());
    • 更清楚地说,Crockford 没有(明确地)推荐该链接中的任何一种形式。 Crockford 建议的唯一相关是将自执行函数包装在括号中。
    • "[...] 再次,我将整个函数和调用包装在括号中。作为向读者表明,除了分配函数之外还有更大的事情发生. 有些人会把金括号放在函数周围而不是整个调用周围——这对我来说没有意义,因为我们试图告诉用户的是:“看看整个事情”,我认为只在其中的一部分加上括号会适得其反,所以我认为整个事情都需要用括号括起来。” -- 道格拉斯·克罗克福德。
    • ...“JavaScript 上的 Crockford——第三幕:终极功能”(2010-02-17)。 56:09 分。
    【解决方案3】:

    就差异而言,它实际上只是语法糖。有点相当于:“你喜欢 jQuery() 还是 $()?”两者都可以编译、执行和互换使用 (AFAIK)。

    从我目前看到的代码示例来看,似乎有更多的人遵循 Crockford 代码约定:

    (function() { ... }()); 
    

    就我个人而言,我更喜欢(function(){})(); 约定,因为对我来说更明显的是该函数是自动执行的;我也是 jQuery 的大用户,这是 jQuery 源代码中使用的约定。

    此外,无论您选择使用哪种形式,使用括号括起您的自动执行函数都被认为是一种很好的做法。

    【讨论】:

    猜你喜欢
    • 2011-08-31
    • 2012-02-13
    • 1970-01-01
    • 2010-09-30
    • 2011-05-17
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多