3

序章

JavaScriptファイルの圧縮にはGoogleClosureCompilerを頻繁に使用しています。今、それは私のコードをかなりうまく圧縮しているようです。

this今、私はオブジェクトをローカル変数に格納する習慣をつけようとしています。なぜならthis、難読化することはできないからですが、ローカル変数は確かに難読化することができます。ただし、Google ClosureCompilerはこれを認識せず、代わりにローカル変数のすべてのインスタンスを削除して、に置き換えますthis

最適化について...

私は、コードを書くときに事前最適化を避けるべきであることをよく知っています。thisただし、キャッシュを使用すると明確になるため、キャッシュは許容できると思います(this多くのコンテキストを持つことができ、別の名前で参照するとあいまいさが軽減されるため)。

以下のコードはかなり基本的なものであり、記述が不十分である可能性があることを理解しています。ただし、コードは私が直面している問題を正確に示しています。

圧縮前の元のソースファイルは次のとおりです。

(function() {
  var that = this;
  that.a = 3;
  that.b = 4;
  this.c = 5;
  return that;
}());

これが圧縮されたソースファイルです。thistoの割り当てthatが削除されていることに注意してください。

(function(){this.a=3;this.b=4;this.c=5;return this})();

that理想的には、割り当てが何らかの形で、おそらくこれに似た形で残ることを期待します。

(function(){var t=this;t.a=3;t.b=4;t.c=5;return t})();

さて、上記のコードはほとんどバイトを節約しませんが、(私がよく行うように)はるかに大きなスクリプトで作業する場合、節約は間違いなく合計されます。

質問

つまり、ClosureCompilerがthat上記のスクリプトの変数を削除しないようにするにはどうすればよいですか?

4

2 に答える 2

2

あなたはコンパイラを考え抜こうとしています。それは敗戦です。しかし、これが人々がこの種のことをしようとする2つの主な理由です。

  1. コードのサイズを縮小します。1文字の変数はキーワードよりも小さいという理論thisです。ただし、この理論にはほとんどの場合欠陥があります。コンパイラのFAQを参照してください。

  2. キーワードのコンテキストがthis変更されないようにします。ただし、SIMPLE_OPTIMIZATIONSでは、これは不要です。変数を参照する内部クロージャを作成する場合、コンパイラは値をインライン化しません。ADVANCED_OPTIMIZATIONSでは、キーワードの使用はthisプロトタイプ関数またはコンストラクターの外部では危険である可能性があるため、注意して行う必要があります。理由を説明する記事を参照してください。

コンパイラが値をインライン化しないようにしたい場合は、引用符で囲まれた構文を使用して、オブジェクトのプロパティとして値を追加する必要があります。

(function() {
  var config = {};
  config['that'] = this;
})()
于 2013-01-08T14:21:34.473 に答える
0

あなたが本当にしなければならないなら、私はあなたがこれをすることができると思います:

(function() {
  var that = this || 1;
  that.a = 3;
  that.b = 4;
  this.c = 5;
  return that;
}());
于 2013-01-08T05:18:13.670 に答える