为什么Closure Compiler为以下两个函数生成不同的代码(使用 advance 选项):
var function1 = function() {
return 1 * Math.random();
};
window['function1'] = function1; // export function1
var function2 = function() {
return function1() + 1;
};
window['function2'] = function2; // export function2
这是生成的代码:
function a() {
return 1 * Math.random();
}
window.function1 = a;
window.function2 = function() {
return a() + 1; // call to a() fails in a more complex example
};
请注意,function1
已重命名为a
,a
已分配给全局变量function1
。使用function2
时,没有与之关联的其他变量名称。为什么呢?
我问的原因是,对于我的代码,来自function1
的对function2
的调用失败,因为重命名的function1
不会被视为function2
中的函数调用1}}而是Javascript解释器认为a()
是一个数字。
任何见解都表示赞赏。 TIA。
答案 0 :(得分:3)
使用ADVANCED_OPTIMIZATIONS,Closure Compiler将删除未使用的代码。由于function2
的唯一用途是在导出中,因此直接分配到导出的名称(而不是首先变量到变量)。 function1
导出并使用function2
,因此编译器保留了初始命名函数,因为它被引用了两次。
至于失败,我们需要看看你的实际代码来解释发生了什么。
答案 1 :(得分:2)
如果“a”是一个数字,很可能会被其他东西覆盖。如果您没有使用多个模块,请尝试使用输出包装器选项来隔离全局变量(如果您使用多个模块,还有其他选项可以隔离全局变量)。通常在“windows.a”上定义一个setter并设置一个断点,会让你知道这种覆盖是如何发生的。