2012-03-06 11 views
3

私は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が定義されているスコープと異なるスコープで使用されているので簡単です。私はそれに到達するまで、どのスコープを定義するのか分からない。

+0

わかりません。カンマを使用する代わりに3つの 'var'ステートメントを作成すると、副作用に違いはありませんが、3つすべてが小さくなります。 – pimvdb

+0

あなたは読んだままに圧縮することはできませんが、圧縮しようとする前にソースファイル(およびソースの外部から来るすべてのグローバルファイル)を完全に理解する必要があります。私は 'var v1、v2、v3、... 'リストで第2、第3などの変数を圧縮できない理由を見ることができません。 –

+0

rootjQueryパラメータが必要であるというご意見をお寄せいただき、ありがとうございました。 – Gerry

答えて

0

私は現在コンプレッサーを固定しています。

Paul Grimeがコメントで述べたように、何かを圧縮する前に、すべての変数とスコープのリスト全体を構築する必要がありました。

JavaScriptは、定義される前に物事を参照することができます。そのため、回避策はありません。

関連する問題