可能重复:
Location of parenthesis for auto-executing anonymous JavaScript functions?
有时候我会看到:
(function() { ... }());
有时候我会看到:
(function() { ... })();
我看到有和没有参数的两种形式。他们 both execute 匿名函数。
这两种形式有区别吗?是否有任何令人信服的理由使用一种形式而不是另一种形式?
答案 0 :(得分:33)
这两种形式没有实际区别,但从语法的观点来看,两者之间的区别在于The Grouping Operator - 括号 - 将在第一个例子中保留CallExpression
,其中包含FunctionExpression
:
CallExpression | | FunctionExpression | | | V V (function() { }()); ^ ^ |--PrimaryExpression --|
在第二个示例中,我们首先得到一个整体CallExpression
,其中包含FunctionExpression
:
PrimaryExpression | FunctionExpression | V (function() { })(); ^ ^ |-- CallExpression --|
答案 1 :(得分:5)
就编译器而言,两者之间没有区别。但是,会发现Douglas Crockford的JavaScript code conventions中推荐(function () {}())
样式。
答案 2 :(得分:2)
就差异而言,它实际上只是语法糖。有点相当于:“你喜欢jQuery()还是$()?”两者都可以互换地编译,执行和使用(AFAIK)。
从我到目前为止看到的代码示例中,似乎有更多人遵循Crockford代码约定:
(function() { ... }());
就个人而言,我更喜欢(function(){})();
约定,因为我更清楚这个函数是自动执行的;我也是jQuery的大用户,这是jQuery源代码中使用的约定。
此外,无论您选择使用哪种形式,都可以使用parens来封装您的自动执行功能。