javascript - JavaScript ES6 模块:避免污染全局命名空间
问题描述
背景
在 JavaScript 中导入模块时,我们会使用导入模块的名称污染全局命名空间:
foo.js
export foo() {..};
export const bar = 3.14;
index.js
import { foo, bar } from './foo.js';
问题
在index.js
,foo
并且bar
生活在全局命名空间中,对吧?所以,假设我发布了这个模块,有人在他们的 HTML 文件中使用它,以及另一个定义变量foo
和bar
全局命名空间的脚本。那我们不会发生碰撞吗?
我想这可以通过将所有内容包装main.js
在 IIFE 中来解决。但是,出于某种原因,ESLint 对此有所抱怨,这让我想知道 IIFE 是否不是保护全局命名空间的首选/推荐方法。
foo
全局命名空间会被and污染bar
吗?- 如果是这样,我应该如何避免它?
谢谢你。
解决方案
在 JavaScript 中导入模块时,我们使用导入模块的名称污染了全局命名空间
不,每个模块都有自己的模块范围,所有导入的绑定和顶级声明都在其中。
在只有 ES6 模块的普通 ES6 环境中,您几乎从不使用全局范围 - 所有模块代码都是严格模式代码,因此您必须努力在全局对象上创建变量。
模块捆绑器通常通过允许您将一些导出声明为捆绑脚本中的全局变量来缓解这种情况,这样您在使用其他脚本时也可以在页面中轻松访问它们。
推荐阅读
- ethereum - 我可以使用 24 字助记符在 Metamask 中导入帐户吗?
- java - JavaFX 无法设置自定义属性
- oracle - INTO 保留关键字不能用作标识符
- asp.net-mvc - 我的 Angular 7 应用程序无法从正确的文件夹加载块
- swift - 如何使用 alamofire 多部分请求 Swift 打印 HTTPBody
- jsf - 触发侦听器点击 ace:textEntry
- angularjs - 选中复选框时将对象从 ng-repeat 传递到数组
- java - 如何访问 Spring 控制器的 JSON 参数?
- sql - 用 sql 填充 ms-access 表
- jquery - html字符串到jquery对象