我想知道,在初始化对象时,额外的括号有什么意义。例如:
var foo = function(){ ... }();
对比
var foo = (function(){ ... }());
我猜这与作用域有关,不过我想知道是否有人能更准确地说明具体的区别,因为它们似乎都是根据每个匿名函数返回值来初始化对象。
我想知道,在初始化对象时,额外的括号有什么意义。例如:
var foo = function(){ ... }();
对比
var foo = (function(){ ... }());
我猜这与作用域有关,不过我想知道是否有人能更准确地说明具体的区别,因为它们似乎都是根据每个匿名函数返回值来初始化对象。
(function() {
// code
})();
这里的括号解决了function
的歧义,使其被视为(...)
组内的单个表达式。
分组运算符只是强制将function
作为表达式进行求值的一种方式。大多数JavaScript运算符都可以用于此目的。一元运算符可能是最安全的选择,例如...
!function() {
// code
}();
...or...
void function() {
// code
}();
function
都被视为各自运算符的单个操作数。两种写法在功能上是等效的。
然而,作为一种惯例,许多程序员更喜欢使用开括号来表示变量是函数的结果,而不是函数本身。
使用自调用函数的目的是传递变量以保留它们的“命名空间”,例如,常见的是传递window或document,或者其他类似jquery的东西。
根据对jslint的一些快速测试,以下测试中第一种写法(foo)是首选方式。
var foo = (function () {}());
var bar = (function () {})();
var baz = function () {}();
http://peter.michaux.ca/articles/an-important-pair-of-parens
(...)
因为它们在=
操作符附近给他们一个视觉提示,表明函数正在被调用。 - user1106925