(function(){...}())之间有区别吗?和(function(){...})();?

时间:2010-09-23 22:37:16

标签: javascript anonymous-function

  

可能重复:
  Location of parenthesis for auto-executing anonymous JavaScript functions?

有时候我会看到:

(function() { ... }()); 

有时候我会看到:

(function() { ... })(); 

我看到有和没有参数的两种形式。他们 both execute 匿名函数。

这两种形式有区别吗?是否有任何令人信服的理由使用一种形式而不是另一种形式?

3 个答案:

答案 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来封装您的自动执行功能。