当原始命名空间为空时,为什么Google Closure Compiler会将变量添加到全局命名空间?

时间:2013-08-26 17:20:12

标签: javascript google-closure-compiler google-closure

我有一个很长的脚本很好地包裹在(function() {/.../})()中,以避免所有类型的名称污染。它是100%打字,没有警告。

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

我可以想到一个工作是使用--output_wrapper来包装它,但我想不出Google会像这样污染命名空间的原因。

有没有?

1 个答案:

答案 0 :(得分:10)

编译器希望它给出所有相关的JavaScript,这样就不必担心与其他脚本的冲突。因此,它假定它可以解开“不必要的”匿名函数。

来自FAQ

  

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

     

Closure编译器的高级优化模式假设可以将新变量添加到全局范围。

     

在JavaScript中,将代码包装在匿名函数中通常是标准做法,因此变量不会污染全局范围。 Closure Compiler具有--output_wrapper标志,正是出于此目的。将其作为--output_wrapper "(function() {%output%})();"调用将在编译时将代码包装在匿名函数中。

     

Closure编译器用户经常发现在编译时执行此包装更容易,更简单,而不是在原始源代码中编写匿名函数包装器。