即时函数调用语法

实际上,有一个JSLint选项是“好的部分”之一,“要求”立即调用周围的东西“,这意味着build筑

(function () { // ... })(); 

而是需要写成

 (function () { // ... }()); 

我的问题是这个 – 任何人都可以解释为什么这第二种forms可能会被认为更好? 它更有弹性吗? 不太容易出错? 第一种forms有什么优势?


既然问了这个问题,我就明白了在function价值和function价值之间有清晰的视觉区分的重要性。 考虑立即调用的结果是赋值expression式的右侧的情况:

 var someVar = (function () { // ... }()); 

虽然最外面的括号在语法上是不必要的,但左括号给出了一个预先指示,即被赋值的值不是函数本身,而是被调用的函数的结果。

这与Crockford有关构造函数大写的build议类似 – 它意味着作为任何查看源代码的人的视觉提示。

来自道格拉斯克罗克福德的风格约定指南 :(search“立即调用”)

当一个函数被立即调用时,整个调用expression式应该被包装在parens中,这样就清楚地表明了正在生成的值是函数的结果而不是函数本身。

所以,基本上,他觉得它更清楚地区分了函数值和函数值。 所以,这是一个风格问题,而不是代码本身的实质性差异。

更新的参考,旧的PPT不再存在

立即调用匿名函数将其包装在parens中,因为:

  1. 它们是函数expression式,并且将其作为函数声明解释为语法错误。

  2. 函数expression式不能以word函数开始。

  3. 将函数expression式赋值给variables时,函数本身不返回,函数的返回值被返回 ,因此,这些顾客会评估他们的内在价值。 当函数执行时,尾随parens ..}()导致函数立即执行。

或者,使用:

 void function () { ... } ()