4

可能重复:
JavaScript 对象/函数/类声明周围的括号是什么意思?

最近和同事讨论哪个最好

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

或者

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

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

谁能解释一下。

*编辑我在互联网上最接近解释的是http://dmitrysoshnikov.com/ecmascript/chapter-5-functions/#question-about-surrounding-parentheses,但在我看来,这停止了解释为什么上面的第一个例子完全有效。

4

2 回答 2

3

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

!function() {
}();

那个感叹号也可以是+or-和其他一些字符。因此,无论您是否使用“狗球”版本(您的后一个)都没有区别。从性能方面来看,我不能保证,但我 99.9% 确信差异为零(可能充其量取决于引擎的变化)。

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

于 2012-02-03T15:08:37.533 回答
2

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

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

这样做也是如此:

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

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

JavaScript 中除表达式语句之外的语句以关键字开头(暂时将标签放在一边)。在任何以关键字开头的语句中function(此处略过),唯一function可以表示的是函数对象值的实例化。

于 2012-02-03T15:08:49.570 回答