我见过两个版本的自执行javascript函数:
(function() { ... })()
和
(function() { ... }())
注意函数执行“()”
的不同位置这两者之间有区别吗?
答案 0 :(得分:5)
有很多方法可以让你正在做的事情产生影响,严格来说,这个话题与闭包的主题只有切合关系。
问题是这样的:在JavaScript中,function
关键字提供两个不同的用途:
var
语句(变量声明),但是对于一个函数; 现在的问题是,当解析器在语句的开头看到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 ..对于后者,它也避免语法模糊。但我推荐前者。