2
// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @exclude_default_externs true
// @js_externs var console = {log: function(){}};
// @output_file_name default.js
// ==/ClosureCompiler==

/** @constructor */
function Test(){};
Test.prototype['action'] = function(){ 
  console.log('Hello');
  return this;
}

var test = new Test();

次の行を追加すると:

test['action']()['action']()['action']();

コンパイルすると、次のサイズになります。

113 bytes (101 bytes gzipped)

その行を次の同等のコードに置き換えると:

test['action']();
test['action']();
test['action']();

私はこのサイズを取得します:

123 bytes (108 bytes gzipped)

私の関数が を返すので、 (最初のテストでどのように行われたか)thisへの呼び出しを連鎖させaction、より小さなサイズの結果を得ることができることを、クロージャ コンパイラが認識してくれることを期待していました。Closure Compiler がこの最適化を行えるように、上記のコードに注釈を付ける方法はありますか?

注:サイズの違いはチェーンによるものです。出力の違いは次のとおりです。

連鎖あり:

(new a).action().action().action();

チェーンなし:

var b=new a;b.action();b.action();b.action();
4

1 に答える 1

1

これにはコンパイラパスがあります:

https://code.google.com/p/closure-compiler/source/browse/src/com/google/javascript/jscomp/ChainCalls.java

ただし、デフォルトでは有効になっていません。テストしたプロジェクトでは節約できませんでしたが、有効にしてみてください。これは、コンパイラの Java API の「CompilerOptions#setChainCalls」メソッドによって制御されます。

于 2013-06-10T05:31:00.227 に答える