揭示模块模式函数初始化风格

3

我想知道,在初始化对象时,额外的括号有什么意义。例如:

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

对比

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

我猜这与作用域有关,不过我想知道是否有人能更准确地说明具体的区别,因为它们似乎都是根据每个匿名函数返回值来初始化对象。


2
在这种特定情况下,没有有效的区别。有些人喜欢外部的 (...) 因为它们在 = 操作符附近给他们一个视觉提示,表明函数正在被调用。 - user1106925
你应该将这个作为回答发出来,这样我就能点赞了。 :) - t3rse
好的。https://dev59.com/72LVa4cB1Zd3GeqPw34t#10078589 - user1106925
3个回答

5
在这种特定情况下,没有有效的差别。
一些人喜欢使用外部的“(…)”,因为它在赋值运算符附近给他们提供了一个视觉提示,说明函数正在被调用。
但是赋值运算符会导致“function”作为右操作数表达式进行评估,并且可以在不需要将其转换为函数声明的情况下调用它。
没有赋值时,需要涉及一些语法,让解释器知道“function”关键字被用作匿名函数表达式。例如...
(function() {
   // code
})();

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


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

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

...or...

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

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

2

两种写法在功能上是等效的。

然而,作为一种惯例,许多程序员更喜欢使用开括号来表示变量是函数的结果,而不是函数本身。

使用自调用函数的目的是传递变量以保留它们的“命名空间”,例如,常见的是传递window或document,或者其他类似jquery的东西。

根据对jslint的一些快速测试,以下测试中第一种写法(foo)是首选方式。

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

请注意,调用()位于外部括号内。
bar和baz的JSLint给出以下错误
错误: 第2行第28个字符的问题:将调用移动到包含函数的括号中。 var bar = (function(w) {})(window);
第3行第27个字符的问题:将立即函数调用包装在括号中,以帮助读者理解表达式是函数的结果,而不是函数本身。 var baz = function(w) {}(window);

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接