我想知道,初始化对象时附加括号的意义是什么。例如:
var foo = function(){ ... }();
与
var foo = (function(){ ... }());
我假设与范围相关的东西,但我想知道是否有人可以更精确地了解具体的差异,因为他们似乎都基于每个匿名函数返回的内容初始化对象。
答案 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