我们可以省略 JavaScript IIFE 的主要括号吗? [复制]

分享于2023年06月22日 anonymous-function function javascript 问答
【问题标题】:Can we omit the main parentheses for JavaScript IIFEs? [duplicate]我们可以省略 JavaScript IIFE 的主要括号吗? [复制]
【发布时间】:2023-06-21 21:30:01
【问题描述】:

对于 JavaScript IIFE 省略主括号 (...) 并在末尾以及函数表达式分配给变量时仅使用 (); 有什么错误(或不良做法)吗?

let foo = function() {
  return 'Hello'
}();

// so we use 'foo', not 'foo()'
console.log(foo); // 'Hello'

虽然 TypeScript 毫无警告地接受了这一点,但我们是否应该始终这样做?

let foo = (function() {
  return 'Hello'
})();

  • doug crockford 喜欢把“狗球”套起来: }()); 这使它看起来更像是一个代码单元。这也可以防止缩小和脚本连接产生语法错误。
  • 如果您的同事知道您的住所,请使用括号并在他们和未来的您必须阅读您的代码时让他们的生活更轻松。
  • 请考虑 (function() { return 'Hello' }()); 是一个完整的语句,而 function() { return 'Hello' }(); 是......一个语法错误。
  • @DavidThomas 是的,你说得对,我完全错过了这一点。当语言中有多种正确代码的方法时,我们必须考虑更高的代码可读性。
  • @dandavis 谢谢..这对我来说是一个很好的提示,我几天前就在考虑它。现在你让我更容易确定 }()); 是一个好人。

【解决方案1】:

您应该 始终 将立即调用的函数括在括号中。它更清楚地表明它是一个 IIFE,省略括号会导致语法错误。不会总是这样,但这两个角色真的值得模棱两可吗?

如果你不包装你的函数,那么我作为另一个开发人员在未来检查你的代码,必须知道滚动到你的函数底部,然后我才会知道它正在被调用而不是函数定义.

【讨论】:

  • 我喜欢“必须向下滚动”部分。
  • 是的,'滚动'的想法很容易被忽略,这非常有说服力......谢谢大家。