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

t3r*_*rse 3 javascript design-patterns

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

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

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

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

小智 5

在那个特定情况下,没有有效的区别.

有些人喜欢外部(...)因为它给=操作员附近的视觉提示,即调用该函数.

但是赋值运算符function会将其作为赋值运算符的右手操作数的表达式进行求值,因此可以调用它而无需进一步将其强制转换为函数声明.


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

例如...

(function() {
   // code
})();
Run Code Online (Sandbox Code Playgroud)

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


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

!function() {
   // code
}();
Run Code Online (Sandbox Code Playgroud)

...要么...

void function() {
   // code
}();
Run Code Online (Sandbox Code Playgroud)

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