我见过 2 个版本的自执行 javascript 函数:
(function() { ... })()
和
(function() { ... }())
注意函数执行“()”的不同位置
这两者有区别吗?
我见过 2 个版本的自执行 javascript 函数:
(function() { ... })()
和
(function() { ... }())
注意函数执行“()”的不同位置
这两者有区别吗?
有很多方法可以得到你正在做的事情的效果,严格来说,这个主题与闭包主题只有相干的关系。
问题是:在 JavaScript 中,function
关键字有两个不同的用途:
var
语句(变量声明),但它是针对一个函数的;现在的问题是,当解析器看到function
语句的开头时,它假定您的意思是声明一个函数;也就是上面的案例1。当你声明一个函数时,你不能在同一个语句中调用它;函数声明语句只是声明函数。
因此,如果您想要的是只包含创建函数及其立即调用的语句,那么您必须让解析器有心情解析表达式。将整个内容放在括号中只是这样做的一种方式。
任何让解析器相信它所看到的是表达式语句的“技巧”都可以:
var dummy = function() { ... whatever ... } ();
!function() { ... whatever ... } ();
0 + function() { ... whatever ... } ();
所有这些以及无数其他示例都进行了设置,以便当解析器看到function
关键字时,它会在表达式的中间进行。
如果 Eich 先生为函数对象中间表达式的实例化选择了不同的关键字(例如lambda),那就没有问题了,因为你可以说
lambda () { ... whatever ... } ();
然而,他没有。
其中任何一个的正确术语是立即执行的功能。
尽管这两种方式的工作方式相同,但出于可读性的原因, Douglas Crockford推荐后者。
当要立即调用一个函数时,整个调用表达式应该用括号括起来,这样就可以清楚地看出生成的值是函数的结果,而不是函数本身。
因此,如果您想遵循该建议,您应该更喜欢使用:
(function() { ... }())
括号确保您有一个表达式(不能以function
关键字开头),以便可以执行它。
此外,ExpressionStatement 不能以 function 关键字开头,因为这可能会使它与 FunctionDeclaration 产生歧义。
这也有效:
(((((function() {...}))())));
前者更好,因为它将 Function 视为“一等公民”。它使用括号来包装函数并调用它。
Em..对于后者,它也避免了语法歧义。
但我推荐前者。