3

YUICompressor(2.4.7)がvar宣言を組み合わせていないことを発見しました。例えば、

var x = 1;
var y = 2;

に圧縮します

var a=1;var b=2;

次のように、ミニファイアが連続するvar宣言を組み合わせることができると期待するのは合理的だと思います

var a=1,b=2;

しかし、私の本当の質問は、(ミニファイアの場合)連続しないvar宣言を単一の関数に自動的かつ安全に組み合わせることが期待/可能であるかどうかです。

4

2 に答える 2

2

場合によります。初期化を伴う宣言について話している場合は、次のようになります。

このことを考慮:

(function () {
    var x = 1;
    console.log(y); // undefined
    var y = 2;
})();

(function () {
    var x = 1, y = 2;
    console.log(y); // 2
})();

ただし、以下は安全であり、ミニファイアが実行する必要があります。

(function () {
    var x = 1, y;
    console.log(y); // undefined
    y = 2;
})();

それは確かに可能です。コンプレッサーは、var出力を生成する前に、含まれているステートメントについて関数全体をスキャンします。これは、変数名を圧縮するために必要です。

varパラメータリストを拡張し、ステートメントを完全に削除することで余分なバイトを節約するという、トリッキーなバリエーションが1つあることに注意してください。

(function (x,y) {
    x = 1;
    console.log(y); // undefined
    y = 2;
})();

ただし、これにより関数の(めったに使用されない)lengthプロパティが変更されるため、ミニファイアからは期待されません。

于 2012-03-19T19:04:46.453 に答える
1

これが望ましくない例を 1 つ知っています。この質問を参照してくださいブラウザーで JavaScript が処理できるオブジェクトのサイズの制限に達しましたか?

その質問は、変数の初期化が単一のvarステートメントで発生したときのバグに関するものでした。問題は、失敗した変数に本当に巨大なリテラルを割り当てることについてでした。最終的な解決策は、オブジェクトを個別の var 宣言に分割することでした。

したがって、コンプレッサーが常にそれを行うと、コードがその種の問題に遭遇する可能性が高くなります

于 2012-03-19T18:17:51.433 に答える