显示模块模式函数初始化样式

时间:2012-04-09 19:15:31

标签: javascript design-patterns

我想知道,初始化对象时附加括号的意义是什么。例如:

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

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

我假设与范围相关的东西,但我想知道是否有人可以更精确地了解具体的差异,因为他们似乎都基于每个匿名函数返回的内容初始化对象。

3 个答案:

答案 0 :(得分:5)

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

有些人喜欢外部(...),因为它会在调用函数的=运算符附近为它们提供视觉提示。

但是赋值运算符会导致function被计算为赋值运算符的右手操作数的表达式,因此可以调用它而无需进一步强制它来自函数声明


如果没有赋值,则需要使用一些语法,让解释器知道function关键字被用作匿名函数表达式。

例如......

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

这里括号解决了function的歧义,以便将其视为(...)组内的单个表达式。


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

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

...或...

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

在这两种情况下,function被视为相应运算符的单个操作数。

答案 1 :(得分:2)

两者在功能上都是等价的。

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

使用自调用函数是传入变量以保留它们的“名称空间”,例如,传递窗口或文档或jquery等其他东西是常见的。

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

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

请注意,invoking()位于外括号内。

JSLint为bar和baz提供了以下错误

  

错误:

     

第2行的问题28:将调用移到parens中   包含该功能。

     

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

     

第3行问题27:包装立即函数调用   在括号中帮助读者理解   表达式是函数的结果,而不是函数本身。

     

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

答案 2 :(得分:0)

据我所知,这只是一项惯例,并非绝对必要。

这是一篇关于为什么这个约定有用的好文章:

http://peter.michaux.ca/articles/an-important-pair-of-parens