2012-04-09 82 views
3

我想知道,当初始化一个对象时,附加括号有什么意义。例如:揭示模块模式函数初始化样式

var foo = function(){ ... }(); 

var foo = (function(){ ... }()); 

我承担相关范围的东西,但我想知道如果有人能更精确地了解具体的差异,因为它们似乎都初始化基于什么每一个对象匿名函数返回。

+2

以下错误在这种特定的情况下,有没有实际的区别。有些人喜欢外层的'(...)',因为它在'='运算符附近为它们提供了一个视觉提示,该函数被调用。 – 2012-04-09 19:20:14

+0

你应该发布这个作为答案,所以我可以upvote它。 :) – t3rse 2012-04-09 19:23:50

+0

好吧。 http://stackoverflow.com/a/10078589/1106925 – 2012-04-09 19:26:26

回答

5

在这种特定的情况下,有没有实际的区别。

有些人喜欢外(...),因为它给了他们在=运算符附近的视觉提示,该函数正在被调用。

但赋值运算符会导致function被评估为作为赋值运算符右手操作数的表达式,因此可以在不需要进一步强制将它从函数声明中强制的情况下调用该表达式。


没有分配,需要有一些语法参与,让翻译知道function关键字被用作一个匿名函数表达式。

例如...

(function() { 
    // code 
})(); 

这里括号解决了function的模糊性,使得它当作(...)组内的一个表达。


分组操作符只是强制function作为表达式求值的一种方法。大多数JavaScript运算符可用于此目的。一元运算符是最安全的可能,例如...

!function() { 
    // code 
}(); 

......或者......

void function() { 
    // code 
}(); 

在这两种情况下,function被看作是单一操作到相应的运营商。

2

两者在功能上是等同的。

但是,作为一个惯例,许多程序员更喜欢左括号来表示var是函数的结果,而不是函数本身。

自调用函数的使用是传递变量以保留它们的“名称空间”,例如,通常在窗口或文档中传递,或者像jQuery一样传递其他东西。

根据jslint的一些快速测试,这样做的首选方法是在以下测试中的第一个(foo)。

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

请注意,invoking()在外部圆括号内。

的JSLint给出了酒吧和巴兹

Error:

Problem at line 2 character 28: Move the invocation into the parens that contain the function.

var bar = (function (w) {})(window);

Problem at line 3 character 27: Wrap an immediate function invocation in parentheses to assist the reader in understanding that the expression is the result of a function, and not the function itself.

var baz = function (w) {}(window);