(…())与(…)()在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在这方面可能会好一点。