代码之家  ›  专栏  ›  技术社区  ›  Peter Ajtai

(function()…())和(function()…())之间有区别吗?[复制品]

  •  21
  • Peter Ajtai  · 技术社区  · 14 年前

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

    有时我看到:

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

    有时我看到:

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

    我看到两种形式都有论点和没有论点。他们 both execute 匿名函数。

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

    3 回复  |  直到 14 年前
        1
  •  33
  •   Christian C. Salvadó    14 年前

    这两种形式没有实际区别,而是 文法的 两者的区别在于 The Grouping Operator -括号-将在第一个示例a中保留 CallExpression ,包括 FunctionExpression :

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

    在第二个例子中,我们首先有一个整体 胼胝体表达 ,这就意味着 函数表达式 :

              PrimaryExpression
                    |
             FunctionExpression
                    |
                    V
        (function() {       })();
        ^                      ^
        |--  CallExpression  --|
    
    
        2
  •  5
  •   cweider    14 年前

    就编译器而言,两者没有区别。但是,会发现 (function () {}()) 在Douglas Crockford的javascript中推荐样式 code conventions .

        3
  •  2
  •   Moses    14 年前

    就差异而言,它实际上只是句法上的糖分。相当于:“您喜欢jquery()还是$()?”两者都可以编译、执行和交替使用(afaik)。

    从我迄今为止看到的代码示例来看,似乎有更多人遵循Crockford代码约定:

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

    就个人而言,我更喜欢 (function(){})(); 约定,因为在我看来,函数是自执行的;我也是jquery的大用户,这是jquery源代码中使用的约定。

    此外,使用parens来包含自执行函数被认为是一种良好的实践,不管您选择使用哪种形式。