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

Mad*_*het 4 javascript google-closure google-closure-compiler

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

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

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

有没有?

JJJ*_*JJJ 10

编译器期望它被赋予所有相关的JavaScript,因此它不需要担心与其他脚本的冲突.因此,它假设它可以解开"不必要的"匿名函数.

来自FAQ:

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

Closure Compiler的高级优化模式假设可以将新变量添加到全局范围.

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

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