有一个JSLint选项,实际上是一个好的部分,“[需要]围绕立即调用的parens,”意味着构造
(function () {
// ...
})();
相反,需要写成
(function () {
// ...
}());
我的问题是 - 有人可以解释为什么第二种形式可能被认为更好吗?它更有弹性吗?不容易出错?它比第一种形式有什么优势?
自从提出这个问题以来,我逐渐理解了在函数值和函数值之间进行清晰视觉区分的重要性。考虑立即调用的结果是赋值表达式的右侧的情况:
var someVar = (function () {
// ...
}());
虽然最外面的括号在语法上是不必要的,但是左括号给出了一个预先指示,即所分配的值不函数本身,而是调用函数的结果。
这类似于Crockford关于构造函数大写的建议 - 它可以作为任何查看源代码的人的视觉提示。
答案 0 :(得分:71)
来自Douglass Crockford的style convention guide :(搜索“立即调用”)
当要立即调用一个函数时,整个调用表达式应该包含在parens中,这样很明显生成的值是函数的结果,而不是函数本身。< / EM> 强>
所以,基本上,他觉得它更清楚地区分了函数值和函数值。所以,这是一个风格问题,而不是代码本身的实质性差异。
更新参考,旧PPT不再存在
答案 1 :(得分:2)
立即调用匿名函数将其包装在parens中,因为:
它们是函数表达式,并且将parens删除会导致它被解释为函数声明,这是一个语法错误。
函数表达式不能以单词function开头。
将函数表达式赋值给变量时,函数本身不会返回,函数的返回值返回,因此parens会评估其中的内容并生成一个值。执行函数时,尾随的{0}}导致函数立即执行。
答案 2 :(得分:-3)
或者,使用:
void function () {
...
} ()