(…())与(…)()在JavaScriptclosures

我知道这很愚蠢,但是这有什么区别:

(function() { var foo = 'bar'; })(); 

和这个?

 (function() { var foo = 'bar'; }()); 

JSLint告诉我们Move the invocation into the parens that contain the function ,但是我不需要。

编辑:答案太酷了。 ~function , JSHint替代scheme以及jQuery对(/***/)();的偏好(/***/)(); 和克罗克福德的解释! 我以为我会得到一个“他们是同样的东西”的答案。
你们通过upvotes决定最好的一个,我打勾。

没有区别。 这两种方法都可以让JavaScriptparsing器把你的函数当作一个expression式而不是一个声明

请注意, +! 也会起作用,有时候被缩小器用来保存尺寸的字符:

 +function() { var foo = 'bar'; }(); !function() { var foo = 'bar'; }(); 

编辑

正如@copy指出的,为了完整性, ~-也将起作用。

 -function() { var foo = 'bar'; }(); ~function() { var foo = 'bar'; }(); 

因为道格拉斯·克罗克福德(Douglas Crockford)说外围括号版本看起来像“狗球”,所以存在JSLint侵害。

你可以听到他在这个video中讨论:

我认为这看起来很愚蠢,因为我们所说的是整个调用,但是我们把这些东西挂在它外面看起来就像狗球一样。

他build议括号内的括号帮助读者理解整个陈述是一个函数expression式而不是一个声明。

不,我不相信有什么区别。 我个人更喜欢前者(和jQuery等人似乎一致),但是他们在我testing过的每一个引擎上工作都一样。

另外,JSLint有时候有点太严格了。 JSHint在这方面可能会好一点。