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

可能重复:
自动执行匿名JavaScript函数的括号的位置?

有时我看到:

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

有时我会看到:

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

我看到两种forms有和没有论据。 他们 执行匿名函数。

这两种forms有什么区别? 是否有任何令人信服的理由使用其中一种forms?

这两种forms没有实际区别,但从语法的angular度来看,两者之间的区别在于, 分组操作符 – 括号 – 将在第一个示例中包含CallExpression ,其中包括FunctionExpression

                CallExpression
                 |  |
        FunctionExpression |
                 |  |
                 VV
     (function(){}());
     ^ ^
     | --PrimaryExpression  -  |

在第二个例子中,我们首先有一个CallExpression ,它包含FunctionExpression

           PrimaryExpression
                 |
          FunctionExpression
                 |
                 V
     (function(){})();
     ^ ^
     |  -  CallExpression  -  |

就编译器而言,两者没有什么区别。 但是,在Douglas Crockford的JavaScript 代码约定中会发现(function () {}())风格是推荐的。

就差异而言,它实际上只是语法糖。 有点相当于:“你喜欢jQuery()还是$()​​?” 两者都可以被编译,执行和交换使用(AFAIK)。

从迄今为止我看到的代码示例中,更多的人似乎遵循Crockford代码惯例:

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

我个人更喜欢(function(){})(); 因为对我来说这个function是自我执行的更为明显; 我也是jQuery的大用户,这是jQuery源代码中使用的惯例。

另外,无论您select哪种forms,使用parens来包装您的自我执行function被认为是一种很好的做法。