закрытие компилятора / uglifyjs - имя этой функции не сокращено? - PullRequest
4 голосов
/ 06 августа 2011

Если я запускаю этот кусок кода через закрывающий компилятор или 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() { .. }

Спасибо, Уэсли

1 Ответ

5 голосов
/ 06 августа 2011

init не сокращается по той же причине test не сокращается ... потому что это часть публичного API вашего кода.

Когда вы вызываете var t = new test(), вы создаете объект, который выглядит следующим образом:

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

и вы можете позвонить t.init(). Если компилятор не учитывает те переменные, которые доступны из глобальной области видимости, вам придется встроить все вашего кода JavaScript в один файл, прежде чем вы его минимизируете. В противном случае, каждый раз, когда вы минимизируете 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 с помощью минификатора и инициализирует какую-то другую букву.)

Что касается второй части вашего вопроса, когда вы делаете this.init = function, вы устанавливаете атрибут для неопределенного объекта (это может быть что угодно, поскольку this устанавливается во время вызова в JavaScript, и вы объявляете его внутри функции test). Когда вы пишете function init(){}, вы пишете объявление функции , которое будет поднято в верхнюю часть охватывающей области (то есть вы можете вызвать его внутри области, в которой оно определено, до того, как вы определил его.) Однако он не будет доступен за пределами test.

...