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 代码内联到一个文件中。否则,每次你缩小test.jspublic functiontest的名字都会改变。所以这段代码:

<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.

于 2011-08-06T18:45:20.533 回答