私はJavaScriptのコンプレッサーを構築していますが、「ローカル変数の縮小」段階にあります。私はコンプレッサーの結果を様々なオンラインコンプレッサーと比較していて、興味深い何かにDean Edwards' /packer/と気づいた。JavaScriptの変数の縮小
はのは、一例として、jQueryライブラリのこのスニペットを見てみましょう:パッカー/これを返す/
(function(a,b){var c=a.document,d=a.navigator,e=a.location});
しかし:
(function(a,b){var c=a.document,navigator=a.navigator,location=a.location});
(function(window, undefined) {
var document = window.document,
navigator = window.navigator,
location = window.location;
});
私のコンプレッサーは、次のコードを返します。
/packer /が変数リスト内の最初の変数を縮小しない理由はありますか?それは単なるバグですか、それとも理由がありますか?
一見、それは私のコンプレッサーが正しいことをやっているし、より良い最終的な結果を与えるように思われる、しかしのは、jQueryライブラリから別の例を見てみましょう:
var jQuery = (function() {
var jQuery = function(selector, context) {
return new jQuery.fn.init(selector, context, rootjQuery);
},
// some other vars
rootjQuery;
// etc...
});
このコードは、理由は重要です変数rootjQuery
は定義される前に参照されます。この場合
/パッカー/同じことをして、唯一のリストの最初のVAR圧縮:それがあるとき、それはrootjQuery
を圧縮していないがために、私のコンプレッサは、コードを少し台無ししかし
var jQuery=(function(){var c=function(a,b){return new c.fn.init(a,b,rootjQuery)},rootjQuery});
を(まだ定義されていないため)return文で言及されていますが、後で定義されるときに圧縮します。
var jQuery=(function(){var a=function(b,c){return new a.fn.init(b,c,rootjQuery)},b});
これは明らかにコードを実行しようとするとエラーが発生します。
これには何らかの方法がありますか?ディーン・エドワーズがこの問題を気づいたように見えます。最初のvarをリストに圧縮するだけで、このようなケースがポップアップするという奇妙なケースでは、エラーは発生しません。
私は定義されていない圧縮の前に使用されていた変数を選んでみましたが、この場合はrootjQuery
が定義されているスコープと異なるスコープで使用されているので簡単です。私はそれに到達するまで、どのスコープを定義するのか分からない。
わかりません。カンマを使用する代わりに3つの 'var'ステートメントを作成すると、副作用に違いはありませんが、3つすべてが小さくなります。 – pimvdb
あなたは読んだままに圧縮することはできませんが、圧縮しようとする前にソースファイル(およびソースの外部から来るすべてのグローバルファイル)を完全に理解する必要があります。私は 'var v1、v2、v3、... 'リストで第2、第3などの変数を圧縮できない理由を見ることができません。 –
rootjQueryパラメータが必要であるというご意見をお寄せいただき、ありがとうございました。 – Gerry