立即函数调用语法

IT技术 javascript syntax jslint iife
2021-01-23 14:10:21

有一个JSLint选项,实际上是 The Good Parts 之一,它“[需要] 将立即调用括起来”,这意味着构造

(function () {

  // ...

})();

而是需要写成

(function () {

  // ...

}());

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


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

var someVar = (function () {

  // ...

}());

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

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

3个回答

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

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

所以,基本上,他觉得这使得函数值和函数值之间的区别更加清晰。所以,这是一个风格问题,并不是代码本身的实质性差异。

更新参考,旧PPT不复存在

我翻遍了网络,但我仍然找不到那个PPT的副本
2021-03-12 14:10:21
我很高兴我读到了这个。我刚刚读完 Javascript: The Good Parts,我一直在想,分配调用函数的结果是非常糟糕的语法,因为您必须查看第一行和最后一行才能了解发生了什么。他没有使用书中的包装括号,但我明白他为什么推荐它们。
2021-03-17 14:10:21
我找不到原始 PPT,但我能够在他的 javascript 约定指南中找到相同的观点。
2021-03-26 14:10:21
archive.org 有吗?
2021-03-26 14:10:21
@altCognito,你能提供一个新的PPT链接吗?
2021-03-29 14:10:21

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

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

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

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

Dathan,你在回答一个不同的问题。您是正确的,括号有时在语法上是必要的,因此解析器可以将函数表达式与函数声明区分开来。但我的问题是关于调用括号的位置。你的第三点是不准确的;在这种情况下,不需要括号。
2021-03-18 14:10:21
我正在回答您的第一个示例,其中未将立即调用的匿名函数分配给变量,因此由于前两个原因,括号在语法上是必要的。第三个原因只是恢复你甚至说过的话:“左括号预先表明被分配的值不是函数本身,而是被调用的函数的结果。” 但我想这不是很清楚。
2021-04-08 14:10:21

或者,使用:

void function () {
...
} ()