javascript - IIFE 在 ES6 之后有何用处?

标签 javascript ecmascript-6 closures iife

我正在学习 JavaScript,我了解一般的函数类型、闭包等。但是对于 IIFE,我最初的 react 是“如果它立即被调用,为什么不直接内联它”。所以我去读了this article描述了 IIFE 的“4 个实际用例”。然而,其中两个与规避 var 带来的作用域问题有关(在 ES6 之后,letconst 不再是一个问题) > 正在介绍)。第三个是处理全局变量命名冲突(C++ 中命名空间通常处理的问题)。而且,据我所知,导入别名(也在 ES6 中引入)解决了这个问题。

剩下的用例是关于闭包的:

作者声称将闭包与 IIFE 相结合为我们提供了“两大好处”:1) 变量的范围是安全的,以及 2) 您可以从外部修改函数内部的变量。但是,根据我对闭包的理解,您可以通过定期闭包获得这两种好处。

例如,

const IIFEclosure = (() => {
  let v = 10;
  return {
    value: _ => v,
    set: newValue => v = newValue,
  };
})();

const handle = () => {
  let v = 10;
  return {
    value: _ => v,
    set: newValue => v = newValue,
  };
};
const closure1 = handle();
const closure2 = handle();

console.log(IIFEclosure.value(), closure1.value(), closure2.value()) // 10 10 10
IIFEclosure.set(20);
closure1.set(30);
closure2.set(40);
console.log(IIFEclosure.value(), closure1.value(), closure2.value()) // 20 30 40

我在这里看到的唯一区别是,您可以使用 handle 创建常规闭包的多个实例,而使用 IIFEclosure 则只能创建一个,因为它会立即在放置并且没有“句柄”。我想它的好处是不会用额外的变量名污染命名空间。我不确定在实践中有一个只能实例化一次的闭包是否有用。但是,除此之外,据我所知,上述两个好处在两个示例中都得到了满足。

因此,如果我的上述推理是有效的,那么这将引出我的开放性问题; IIFE 在后 ES6 JavaScript 中的好处/用例是什么(如果有的话)?

最佳答案

闭包还有一个小优势:函数本身可以匿名,避免了一个(函数)变量。例如,在您的示例中,非 IIFE 将 handle 作为额外变量。如果您想最大程度地减少当前作用域(甚至可能是全局作用域)的垃圾,那么 IIFE 仍然很有用。

我还发现 IIFE 在顶层对于使用 await 很有用——尽管它会被命名为 IIAFE:

(async () => {
    const response = await fetch("....");
    const object = await response.json();
    // ...
    const result = await lookup(object.id);
    // ...
})();

自 ECMAScript 2022 推出以来 top-level await ,不再需要在 modules 中有这样的 async 包装器。

关于全局名称别名的用例,也可以用普通 block 解决:

{
    const $ = jQuery;
    // Here comes $-referencing code that will not conflict with "outside" $ use.
}

关于javascript - IIFE 在 ES6 之后有何用处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74003165/

相关文章:

javascript - meteor .js : Wait for server to finish

javascript - 是否可以使用 extjs 4 上传没有表单的文件?

javascript - _plugins_vuetify__WEBPACK_IMPORTED_MODULE_136__.default 不是构造函数

javascript - es6协作者的模拟构建

java - java 是否应该给出有关从内部类分配私有(private)变量的错误消息?

javascript - Backbone.JS 中未捕获的 TypeError : Illegal constructor – Using Bonsai. JS

javascript - 调用导入类的方法时使用 Async/Await

javascript - 替换测试中的特定模块

javascript - 意外的关闭行为

python - python 闭包中的 cell_contents