【发布时间】:2023-10-30 20:06:02
【问题描述】:
有一个JSLint 选项,实际上是 The Good Parts 之一,它“[需要] parens around immediate invocations”,这意味着构造
(function () {
// ...
})();
应该写成
(function () {
// ...
}());
我的问题是——谁能解释为什么第二种形式可能被认为更好?是不是更有韧性?更不容易出错?它比第一种形式有什么优势?
自从提出这个问题后,我开始明白在函数值和函数值之间进行清晰的视觉区分的重要性。考虑立即调用的结果是赋值表达式右侧的情况:
var someVar = (function () {
// ...
}());
虽然最外面的括号在语法上是不必要的,但左括号给出了一个预先指示,即被分配的值不是函数本身,而是被调用的函数的结果。
这类似于 Crockford 关于构造函数大写的建议——它旨在为任何查看源代码的人提供视觉提示。
【问题讨论】:
-
感谢您指出这一点。我从来没有找到摆脱 JSLint 的警告消息“在循环中创建函数时要小心”的方法。我很小心,确实将函数放在了一个闭包中,但 JSLint 仍然抱怨。现在我知道它假定我使用了第二种模式。
-
我一直在做“错误”。当我说“一直以来”时,我从 1995 年就开始编写 JavaScript。
标签: javascript syntax jslint iife