【发布时间】:2018-05-21 22:30:49
【问题描述】:
背景
在 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和bar污染吗? - 如果是这样,我应该如何避免?
谢谢。
【问题讨论】:
-
通常你会导出
{ foo: ..., bar: ... },然后使用它的名字导入整个模块。这样你就只有在index.js的全局命名空间中拥有模块的名称,并且可以使用myModule.foo来访问foo。 -
您是否使用任何类型的捆绑程序?如果是这样,它们会将每个文件视为 IIFE,因此,
foo和bar将不会放在全局范围内。如果你不是,但是,是的,克里斯 G 说的是正确的 -
嗨@ChrisG。不幸的是,我仍然会用
myModule污染全球名称空间。此外,它会迫使我使用对象/属性语法。 -
根据您的示例,“在 index.js 中,foo 和 bar 位于全局命名空间中,对吗?”是的。
-
使用 eslint.org/demo,选择 ES6,我使用
(function(){ let foo = 5; const bar = 3.14; if(foo) foo += bar; })()并得到“Lint-free!”
标签: javascript module ecmascript-5