javascript自执行函数 - 不同的语法

时间:2012-09-13 13:41:00

标签: javascript syntax

我见过两个版本的自执行javascript函数:

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

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

注意函数执行“()”

的不同位置

这两者之间有区别吗?

4 个答案:

答案 0 :(得分:5)

有很多方法可以让你正在做的事情产生影响,严格来说,这个话题与闭包的主题只有切合关系。

问题是这样的:在JavaScript中,function关键字提供两个不同的用途

  1. 它引入了一个函数声明语句,它类似于var语句(变量声明),但是对于一个函数;
  2. 它在更大的表达式的上下文中引入了函数文字表达式。
  3. 现在的问题是,当解析器在语句的开头看到function时,它假定你要声明一个函数;也就是说,上面的案例1。声明函数时,不能在同一语句中调用它;函数声明语句只是声明函数。

    因此,如果您想要的是一个包含的函数创建及其立即调用的语句,您必须将解析器放在解析表达式的心情中。把整个事情放在括号中只是一种方法。

    任何“技巧”都会使解析器相信它所看到的是一个表达式语句:

    var dummy = function() { ... whatever ... } ();
    
    !function() { ... whatever ... } ();
    
    0 + function() { ... whatever ... } ();
    

    所有这些以及无数其他示例都设置了这样的结果:当解析器看到function关键字时,它会在表达式的中间执行。

    如果Eich先生为函数对象mid-expression(例如 lambda )的实例化选择了不同的关键字,那么就没有问题,因为你可以随后说< / p>

    lambda () { ... whatever ... } ();
    
    然而,他没有。

答案 1 :(得分:1)

括号确保您有一个表达式(不能以function关键字开头),以便它可以被执行。

来自ECMAscript Language Specification

  

另外,一个   ExpressionStatement不能以function关键字开头,因为   这可能会使FunctionDeclaration模糊不清。

这也有效:

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

答案 2 :(得分:1)

其中任何一个的正确术语是立即执行的函数。

虽然这两种方法的工作方式相同,但Douglas Crockford建议后者出于可读性的原因。

  

当要立即调用函数时,整个调用   表达应该用parens包裹,以便明确表示   产生的价值是功能的结果,而不是   功能本身。

因此,如果您想遵循该建议,您应该更喜欢使用:

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

答案 3 :(得分:0)

前者更好,因为它将功能视为“一等公民”。它使用括号来包装函数并调用它。

Em ..对于后者,它也避免语法模糊。

但我推荐前者。