4

このコードをクロージャ コンパイラまたは uglifyjs で実行すると、this.init は短縮されません。その理由を誰か教えてもらえますか?

function test() {
    var v = "abc";
    this.init = function() {
         alert('var = ' + v + ' and func = ' + f());
         f2();
    }
    function f() {
        return 'def';
    }
    function f2() {
        v = "ghi";
        alert('blabla');
        alert('filler');
    }
}

test();

uglifyjs はこれを次のように変換します。

function test(){function c(){a="ghi",alert("blabla"),alert("filler")}function b(){return"def"}var a="abc";this.init=function(){alert("var = "+a+" and func = "+b()),c()}}test()

美化されたもの:

function test() {
    function c() {
        a = "ghi", alert("blabla"), alert("filler")
    }
    function b() {
        return "def"
    }
    var a = "abc";
    this.init = function () {
        alert("var = " + a + " and func = " + b()), c()
    }
}

test()

では、なぜ this.init() も短い名前に変更されないのでしょうか?

さらに、次のことの違いは正確には何ですか:

 function init() {..}

 this.init = function() { .. }

ありがとう、ウェズリー

4

1 に答える 1

5

init同じ理由testで短縮されません...短縮されません...コードのパブリックAPIの一部であるためです。

呼び出すvar t = new test()と、次のようなオブジェクトが作成されます。

{
    init: function() { ... },
    prototype: test
}

そして、あなたは呼び出すことができますt.init()。コンパイラがグローバルスコープから利用できる変数を尊重しなかった場合は、最小化する前に、すべてのJavaScriptコードを1つのファイルにインライン化する必要があります。test.jsそうしないと、パブリック関数testの名前を縮小するたびに変更されます。したがって、このコード:

<script type="text/javascript" src="js/test.min.js"></script>
<script type="text/javascript">
var t = new test();
t.init();
</script>

壊れます(testおそらくミニファイアによってに変更さaれ、他の文字に初期化されるためです)。

質問の2番目の部分に関してはthis.init = function、不確定なオブジェクトに属性を設定しています(thisJavaScriptで呼び出し時に設定され、関数内で宣言しているため、何でもかまいませんtest)。あなたが書くとき、function init(){}あなたは関数宣言を書いています、それは囲んでいるスコープの一番上に持ち上げられます(あなたがそれを定義する前に、それが定義されているスコープの中でそれを呼び出すことができることを意味します)。の外で利用可能ですtest

于 2011-08-06T18:45:20.533 に答える