为什么Google闭包编译器在原始命名空间为空的情况下向全局命名空间添加变量
Why does Google Closure Compiler adds variable to the global namespace when the original namespace was empty?
我有一个很好地封装在(function() {/.../})()
中的长脚本,以避免所有类型的名称污染。它是100%键入的,没有任何警告。
我发现Google Closure编译器首先在全局命名空间中重新定义i
和j
,这感觉既不必要又危险,尤其是因为我正在编译一个对命名空间没有干扰的脚本。(编译后的脚本以var i=null,j=!1;
开头,我相信是出于紧凑的原因)。
我能想到一种方法,那就是使用--output_wrapper
来包装它,但我想不出谷歌为什么会这样污染命名空间。
有吗?
编译器希望为提供所有相关的JavaScript,这样就不必担心与其他脚本发生冲突。因此,它假设它可以打开";不必要的";匿名函数。
来自常见问题解答:
当使用高级优化时,闭包编译器会将新变量添加到全局范围中。如何确保我的变量不会与页面上的其他脚本发生冲突
闭包编译器的高级优化模式假定可以向全局范围添加新变量。
在JavaScript中,通常的标准做法是将代码封装在匿名函数中,这样变量就不会污染全局范围。闭包编译器有一个
--output_wrapper
标志正是为了这个目的。将其作为--output_wrapper "(function() {%output%})();"
调用将在编译时将代码封装在一个匿名函数中。闭包编译器用户通常发现在编译时进行这种包装比在原始源代码中编写匿名函数包装更容易、更简单。
相关文章:
- 如何在未直接触发的情况下停止事件
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 在不使用jquery的情况下查找页面中的所有锚点并附加函数
- 如何在没有jQuery的情况下模拟按名称命名的事件或解除单个事件的绑定
- 如何在不污染全局命名空间的情况下共享常用的jquery函数
- 在不使用200行var的情况下,在结果字段中添加顺序命名的变量?[PDF表格]
- 如何在不让web组件的原型进入全局命名空间的情况下维护它们之间的依赖关系
- 如何在有或没有 IIFE 的情况下为 JavaScript 代码命名命名空间
- 为什么Google闭包编译器在原始命名空间为空的情况下向全局命名空间添加变量
- 在不重新绘制的情况下为现有画布添加更多空间
- 如何在没有任何名称空间冲突的情况下获得Javascript中的哈希表或记录类型
- 在不重命名原始文件的情况下吞下minify
- 防止闭包编译器在不使用括号表示法的情况下重命名属性
- TypeScript在命名空间下扩展JQuery
- 如何在不占用空间的情况下隐藏元素,同时还能响应事件
- 模块模式下的JavaScript命名空间
- 如何让下拉菜单在页面空间不足的情况下上升- HTML/Javascript
- 在单个命名空间下组织javascript模块
- 为什么不能在一个“命名空间”中使用函数?JavaScript文件填充下拉列表
- 在没有命名空间的情况下引用单例体到单例体,但是如何