3

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

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

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

注意函数执行“()”的不同位置

这两者有区别吗?

4

4 回答 4

5

有很多方法可以得到你正在做的事情的效果,严格来说,这个主题与闭包主题只有相干的关系。

问题是:在 JavaScript 中,function关键字有两个不同的用途

  1. 它引入了一个函数声明语句,它有点像一个var语句(变量声明),但它是针对一个函数的;
  2. 它在更大的表达式的上下文中引入了函数文字表达式。

现在的问题是,当解析器看到function语句的开头时,它假定您的意思是声明一个函数;也就是上面的案例1。当你声明一个函数时,你不能在同一个语句中调用它;函数声明语句只是声明函数。

因此,如果您想要的是包含创建函数及其立即调用的语句,那么您必须让解析器有心情解析表达式。将整个内容放在括号中只是这样做的一种方式。

任何让解析器相信它所看到的是表达式语句的“技巧”都可以:

var dummy = function() { ... whatever ... } ();

!function() { ... whatever ... } ();

0 + function() { ... whatever ... } ();

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

如果 Eich 先生为函数对象中间表达式的实例化选择了不同的关键字(例如lambda),那就没有问题了,因为你可以说

lambda () { ... whatever ... } ();

然而,他没有。

于 2012-09-13T13:46:15.003 回答
1

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

尽管这两种方式的工作方式相同,但出于可读性的原因, Douglas Crockford推荐后者。

当要立即调用一个函数时,整个调用表达式应该用括号括起来,这样就可以清楚地看出生成的值是函数的结果,而不是函数本身。

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

(function() { ... }())
于 2012-09-13T14:01:21.290 回答
1

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

来自ECMAscript 语言规范

此外,ExpressionStatement 不能以 function 关键字开头,因为这可能会使它与 FunctionDeclaration 产生歧义。

这也有效:

(((((function() {...}))())));​
于 2012-09-13T13:41:45.567 回答
0

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

Em..对于后者,它也避免了语法歧义。

但我推荐前者。

于 2013-08-11T10:02:42.913 回答