为什么Google闭包编译器在原始命名空间为空的情况下向全局命名空间添加变量

Why does Google Closure Compiler adds variable to the global namespace when the original namespace was empty?

本文关键字:命名空间 情况下 全局 变量 添加 闭包 Google 编译器 原始 为什么      更新时间:2023-09-26

我有一个很好地封装在(function() {/.../})()中的长脚本,以避免所有类型的名称污染。它是100%键入的,没有任何警告。

我发现Google Closure编译器首先在全局命名空间中重新定义ij,这感觉既不必要又危险,尤其是因为我正在编译一个对命名空间没有干扰的脚本。(编译后的脚本以var i=null,j=!1;开头,我相信是出于紧凑的原因)。

我能想到一种方法,那就是使用--output_wrapper来包装它,但我想不出谷歌为什么会这样污染命名空间。

有吗?

编译器希望为提供所有相关的JavaScript,这样就不必担心与其他脚本发生冲突。因此,它假设它可以打开";不必要的";匿名函数。

来自常见问题解答:

当使用高级优化时,闭包编译器会将新变量添加到全局范围中。如何确保我的变量不会与页面上的其他脚本发生冲突

闭包编译器的高级优化模式假定可以向全局范围添加新变量。

在JavaScript中,通常的标准做法是将代码封装在匿名函数中,这样变量就不会污染全局范围。闭包编译器有一个--output_wrapper标志正是为了这个目的。将其作为--output_wrapper "(function() {%output%})();"调用将在编译时将代码封装在一个匿名函数中。

闭包编译器用户通常发现在编译时进行这种包装比在原始源代码中编写匿名函数包装更容易、更简单。