为什么Closure Compiler生成不同的语法?

时间:2012-11-14 00:04:13

标签: javascript google-closure-compiler

为什么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已重命名为aa已分配给全局变量function1。使用function2时,没有与之关联的其他变量名称。为什么呢?

我问的原因是,对于我的代码,来自function1的对function2的调用失败,因为重命名的function1不会被视为function2中的函数调用1}}而是Javascript解释器认为a()是一个数字。

任何见解都表示赞赏。 TIA。

2 个答案:

答案 0 :(得分:3)

使用ADVANCED_OPTIMIZATIONS,Closure Compiler将删除未使用的代码。由于function2的唯一用途是在导出中,因此直接分配到导出的名称(而不是首先变量到变量)。 function1导出并使用function2,因此编译器保留了初始命名函数,因为它被引用了两次。

至于失败,我们需要看看你的实际代码来解释发生了什么。

答案 1 :(得分:2)

如果“a”是一个数字,很可能会被其他东西覆盖。如果您没有使用多个模块,请尝试使用输出包装器选项来隔离全局变量(如果您使用多个模块,还有其他选项可以隔离全局变量)。通常在“windows.a”上定义一个setter并设置一个断点,会让你知道这种覆盖是如何发生的。