【发布时间】:2015-12-21 04:29:04
【问题描述】:
显然,ES6 doesn't need namespacing 因为每个文件都是一个单独的模块。
那么,我该如何避免全局命名空间干扰呢?
例如,Babel 编译我的scripts/main.js 文件,只需将const 替换为var。
var alert = 'This line doesn\'t do anything.'
window.alert(alert)
带有 IIFE 的命名空间(下面命名为 ANS)可防止名称冲突:
const ANS = (function () {
const alert = 'This works'
window.alert(alert + '.')
return {alert: alert + ' too.'}
})()
alert(ANS.alert)
将属性添加到命名空间 ANS 比将它们添加到全局命名空间 window 或 this 更干净。并且,IIFE 提供了进一步的封装。
那么,第二种方式(即使用 IIFE 创建自定义命名空间)不是比第一种更好吗?如果是这样,在 ES2015 中有更新/更好的方法吗?为什么 Babel 不为我做这个?
【问题讨论】:
-
为什么覆盖这样的全局变量是您必须担心的事情?反正你也可以
alert()。 -
@loganfsmyth 因为Global Object
window有很多属性。我的应用程序也会有一些,我想避免潜在的名称冲突。请查看我更新的问题。 -
也许在这个问题上有一些误解。您在第一个示例中是否关注
alert === window.alert?如果是这样,那么在真正的 ES6 环境中情况并非如此,尽管它可能使用转译器。将 ES6 模块与适当的模块捆绑器一起使用时,绝对不是这种情况。 -
@loganfsmyth 这是有道理的。谢谢你。在关闭
body标记之前,我的index.html引用了Babel 的scripts/main.js编译。 Babel 不会为我将我的代码包装在 IIFE 中。我更新了我的问题。
标签: namespaces global-variables ecmascript-6 babeljs iife