1

Closure Compilerが次の 2 つの関数に対して( 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関連付けられている他の変数名はありません。なんで?

私が尋ねる理由は、私のコードの場合、function1fromへの呼び出しがfunction2失敗するためです。これは、名前が変更さfunction1れたものが関数呼び出しとして認識されfunction2ず、Javascript インタープリターがそれa()を数値と見なすためです。

どんな洞察も高く評価されます。ティア。

4

2 に答える 2

3

ADVANCED_OPTIMIZATIONS を使用すると、Closure Compiler は未​​使用のコードを削除します。の唯一の使用はfunction2エクスポートであったため、変数への最初の割り当てではなく、エクスポートされた名前への割り当てが直接行われました。 function1によってエクスポートされ、使用されたfunction2ため、コンパイラは最初の名前付き関数を 2 回参照したままにしました。

失敗に関しては、何が起こっているのかを説明するために実際のコードを確認する必要があります。

于 2012-11-14T03:44:06.760 に答える
2

「a」が数字の場合、他の何かによって上書きされている可能性があります。複数のモジュールを使用していない場合は、出力ラッパー オプションを使用してグローバルを分離してみてください (複数のモジュールを使用している場合は、グローバルを分離する他のオプションがあります)。多くの場合、「windows.a」でセッターを定義し、そこにブレークポイントを設定すると、この上書きがどのように発生しているかがわかります。

于 2012-11-14T06:49:57.903 に答える