我有一个很长的脚本很好地包裹在(function() {/.../})()
中,以避免所有类型的名称污染。它是100%打字,没有警告。
我发现Google Closure编译器首先在全局命名空间中重新定义i
和j
,这感觉既不必要又危险,特别是因为我正在编译一个对命名空间没有干扰的脚本。 (编译后的脚本以var i=null,j=!1;
开头,我认为这是紧凑的原因。
我可以想到一个工作是使用--output_wrapper
来包装它,但我想不出Google会像这样污染命名空间的原因。
有没有?
答案 0 :(得分:10)
编译器希望它给出所有相关的JavaScript,这样就不必担心与其他脚本的冲突。因此,它假定它可以解开“不必要的”匿名函数。
来自FAQ:
使用高级优化时,Closure Compiler会将新变量添加到全局范围。如何确保我的变量不会与页面上的其他脚本发生冲突?
Closure编译器的高级优化模式假设可以将新变量添加到全局范围。
在JavaScript中,将代码包装在匿名函数中通常是标准做法,因此变量不会污染全局范围。 Closure Compiler具有
--output_wrapper
标志,正是出于此目的。将其作为--output_wrapper "(function() {%output%})();"
调用将在编译时将代码包装在匿名函数中。Closure编译器用户经常发现在编译时执行此包装更容易,更简单,而不是在原始源代码中编写匿名函数包装器。