在javascript中(...)究竟做了什么

时间:2012-02-03 15:03:28

标签: javascript function invocation

  

可能重复:
  What do parentheses surrounding a JavaScript object/function/class declaration mean?

最近与最好的同事讨论

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

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

我想知道(...)实际上在基本层面上做了什么,以及js引擎在上述两种情况下的作用之间有什么区别。理论上(即使只是很小的数量)一种方法比另一种更快吗?如果我的函数返回一个对象,那么(...)对第一个例子中的对象做了什么?

任何人都可以解释。

*编辑我在互联网上得到的最接近的解释是http://dmitrysoshnikov.com/ecmascript/chapter-5-functions/#question-about-surrounding-parentheses,但在我看来,这很难解释为什么上面的第一个例子可以解决。

2 个答案:

答案 0 :(得分:3)

你根本不需要括号。这些括号的整个想法是强制函数为expression而不是声明。您也可以实现

!function() {
}();

该感叹号也可以是+-以及其他一些字符。因此,无论您是否使用“狗球”版本(后者),都没有区别。从性能方面来说,我不能保证,但我99.9%肯定没有差异(可能最好是引擎相关的变化)。

因此,如果我们假设这两者之间没有性能差异,那么您使用的几乎就是个人偏好。 Crock 多次宣称第二个版本为“狗球”,因为你不再包装整个表达式了。我同意这一点。如前所述,模式只是强制执行函数表达式,它应该封装整个事物以提高可读性。

答案 1 :(得分:2)

第一个示例与第二个示例的工作原理完全相同。没有真正的区别。这也有效:

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

这样做:

var _dont_care_ = function() { ... } ();

关键是安排function关键字出现在语句中,解析器知道它不能是函数声明语句的开头。在这种情况下,function关键字必须将函数对象实例化为表达式中的

除了表达式语句之外的JavaScript语句以关键字开头(暂时不使用标签)。在function关键字开头的任何语句中(在这里出去),function唯一可能意味着是函数对象的实例化值。