(...())与javascript闭包中的(...)()

Cam*_*tin 63 javascript comparison closures jslint anonymous-function

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

(function() {  
    var foo = 'bar';  
})();
Run Code Online (Sandbox Code Playgroud)

还有这个?

(function() {  
    var foo = 'bar';  
}());
Run Code Online (Sandbox Code Playgroud)

JSLint告诉我们Move the invocation into the parens that contain the function,但我认为没有必要.

编辑:答案太酷了.~function,JSHint的替代方案以及jQuery对(/***/)();Crockford的解释的偏好!我以为我会得到一个"他们是同一件事"的答案.
你们通过upvotes决定最好的一个,我勾选它.

Ada*_*kis 49

没有区别.两者都是使JavaScript解析器将您的函数视为表达式而不是声明的有效方法.

请注意,+并且!也可以使用,并且有时使用minifiers来保存大小的字符:

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

!function() {  
    var foo = 'bar';  
}();
Run Code Online (Sandbox Code Playgroud)

编辑

正如@copy指出的那样,为了完整性,~-也会起作用.

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

~function() {  
    var foo = 'bar';  
}();
Run Code Online (Sandbox Code Playgroud)

  • 为了完整起见,`~`和`-`也会这样做(所有一元运算符).```当然是最酷的方式. (14认同)
  • 哇,+1这个神秘的语法!如果他们在生产中看到这一点,就必须让一些毫无防备的编码员抓挠他们的头脑.它是否可以跨浏览器工作?它在规格中吗?我无法理解为什么它有效. (3认同)
  • 是的,你忘记了一个一元运算符!:D但它不会缩短或清晰.http://jsfiddle.net/minitech/WL8tU/1/(还有@CamiloMartin;你忘了的二元运算符.) (2认同)
  • 哦,还有一个更清楚的是`void`,尽管我讨厌那个关键字.(仅供参考.)http://jsfiddle.net/WL8tU/2/ (2认同)

Rob*_*ska 38

JSLint违规存在是因为Douglas Crockford说外括号版本看起来像"狗球".

你可以听到他在这个视频中讨论它:

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

他建议内部的括号帮助读者理解整个语句是函数表达式而不是声明.

  • 我想在JSLint中使用`Ignore Douglas Crockford的首选项'复选框. (18认同)
  • @Rob - 我知道他抱怨使用`++`.对不起,但我**永远不会**,**曾经**同意. (4认同)

Ry-*_*Ry- 10

不,我不相信有任何区别.我个人更喜欢前者(和jQuery等人似乎同意),但它们在我测试过的每个引擎中都有相同的作用.

而且,有时JSLint有点过于严格.在这方面,JSHint可能会好一点.

  • 我也更喜欢前者. (2认同)