即时函数调用语法

有一个 JSLint选项,实际上是“好的部分”中的一个,“[需要]围绕即时调用的括号”意味着构造

(function () {


// ...


})();

would instead need to be written as

(function () {


// ...


}());

我的问题是,有人能解释一下为什么第二种形式会被认为更好吗?它更有弹性吗?不那么容易出错?它比第一种形式有什么优势?


自从提出这个问题以来,我开始理解在函数值和函数值之间有一个清晰的视觉区别的重要性。考虑这样一种情况,即立即调用的结果是赋值表达式的右边:

var someVar = (function () {


// ...


}());

尽管最外面的圆括号在语法上是不必要的,但是开始的圆括号提供了一个预先的指示,即被赋值的值是函数本身的 没有,而不是被调用的函数的结果。

This is similar to Crockford's advice regarding capitalization of constructor functions -- it is meant to serve as a visual cue to anyone looking at the source code.

44168 次浏览

摘自道格拉斯 · 克罗克福德的 风格会议指南风格会议指南: (搜索“立即调用”)

当要立即调用一个函数时,应该将整个调用表达式包装在括号中,这样就可以清楚地看到,所产生的值是函数的结果,而不是函数本身。

So, basically, he feels it makes more clear the distinction between function values, and the values of functions. So, it's an stylistic matter, not really a substantive difference in the code itself.

更新参考,旧 PPT 不再存在

立即调用的匿名函数用括号括起来,因为:

  1. 它们是函数表达式,省略括号会导致将其解释为函数声明,这是一个语法错误。

  2. 函数表达式不能以单词函数开头。

  3. 当将函数表达式赋给一个变量时,函数本身不会返回,函数执行时函数的返回值是 returned,因此括号评估它们内部的东西并产生一个值。,后面的括号 ..}()会导致函数立即执行。

或者,使用:

void function () {
...
} ()