【发布时间】:2012-02-05 03:52:55
【问题描述】:
我知道这很愚蠢,但这之间有什么区别:
(function() {
var foo = 'bar';
})();
还有这个?
(function() {
var foo = 'bar';
}());
JSLint 告诉我们Move the invocation into the parens that contain the function,但我认为没有必要。
编辑:答案太酷了。 ~function、JSHint 替代方案以及 jQuery 对 (/***/)(); 的偏好以及 Crockford 的解释!我以为我会得到“它们是一样的”这样的答案。
你们通过upvotes决定最好的一个,我打勾。
【问题讨论】:
-
这两个示例几乎相同,但
dog balls版本在第一组括号之外返回结果,而 Crockford 批准的版本在括号内返回结果。这很少是重要的,但它是一个区别。 -
@Okonomiyaki3000 没有区别,除非您显着更改它(即在括号内添加更多内容)。事实上,我假设
foo = (/***/)();和foo = (/***/());可以编译成相同的字节码。考虑(a + b) + (c + d)将如何编译为与a + (b + c) + d相同。 -
是的,
foo = (/***/)();和foo = (/***/());相同,但(foo = /***/)();和(foo = /***/)();不同。而且,是的,这是迂腐的。这样做可能永远没有很好的理由。 -
@Okonomiyaki3000 这似乎不够迂腐,因为我正要指出你说的两个不同的例子实际上是相同的。
-
确实如此。上一篇文章有错别字。实际上,两者不同的是:
(foo = /***/)();和(foo = /***/());
标签: javascript comparison closures anonymous-function jslint