113

有一个JSLint选项,实际上是 The Good Parts 之一,它“[需要] parens around immediate invocations”,这意味着构造

(function () {

  // ...

})();

而是需要写成

(function () {

  // ...

}());

我的问题是——谁能解释为什么第二种形式可能被认为更好?是不是更有韧性?更不容易出错?它比第一种形式有什么优势?


自从提出这个问题后,我开始理解在函数值和函数值之间进行清晰视觉区分的重要性。考虑立即调用的结果是赋值表达式右侧的情况:

var someVar = (function () {

  // ...

}());

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

这类似于 Crockford 关于构造函数大写的建议——它旨在为任何查看源代码的人提供视觉提示。

4

3 回答 3

76

来自 Douglass Crockford 的风格约定指南:(搜索“立即调用”)

当要立即调用函数时,应将整个调用表达式包裹在括号中,以便清楚地生成的值是函数的结果,而不是函数本身。

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

更新参考,旧PPT不存在了

于 2009-06-02T13:11:06.463 回答
2

立即调用的匿名函数将其包裹在括号中,因为:

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

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

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

于 2012-02-23T21:06:57.513 回答
-4

或者,使用:

void function () {
...
} ()
于 2014-03-27T18:30:40.293 回答