1

为什么 Closure Compiler 会为以下两个函数生成不同的代码(使用高级选项):

  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分配给全局变量function1function2没有其他变量名与之关联。为什么?

我问的原因是,在我的代码的情况下,对function1from的调用function2失败,因为重命名function1不被视为函数调用,function2而是 Javascript 解释器认为这a()是一个数字。

任何见解都值得赞赏。TIA。

4

2 回答 2

3

使用 ADVANCED_OPTIMIZATIONS,闭包编译器将删除未使用的代码。由于唯一的用途function2是在导出中,因此直接对导出的名称进行赋值(而不是首先对变量进行赋值)。 function1被导出和使用,function2因此编译器保留了初始命名函数,因为它被引用了两次。

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

于 2012-11-14T03:44:06.760 回答
2

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

于 2012-11-14T06:49:57.903 回答