closure编译器/ uglifyjs - this.function名称没有缩短?

Wes*_*ley 4 compression jquery function google-closure-compiler uglifyjs

如果我通过闭包编译器或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();
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

美化是:

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()
Run Code Online (Sandbox Code Playgroud)

那么为什么this.init()也没有更改为更短的名字?

另外,做什么之间的区别究竟是什么:

 function init() {..}
Run Code Online (Sandbox Code Playgroud)

 this.init = function() { .. }
Run Code Online (Sandbox Code Playgroud)

谢谢,韦斯利

Sea*_*ira 5

init没有缩短因为同样的原因test没有缩短...因为它是你的代码的公共API的一部分.

当你打电话时,var t = new test()你会创建一个如下所示的对象:

{
    init: function() { ... },
    prototype: test
}
Run Code Online (Sandbox Code Playgroud)

你可以打电话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>
Run Code Online (Sandbox Code Playgroud)

会破坏(因为test可能a缩小器改为初始化并初始化为其他一些字母.)

至于问题的第二部分,当你这样做的时候,你就是this.init = function在一个不确定的对象上设置一个属性(它可以是任何东西,因为它this是在JavaScript的调用时设置的,你在函数内部声明它test).在编写时,function init(){}您正在编写一个函数声明,它将被提升到封闭范围的顶部(意味着您可以在定义它之前调用它,在它定义的范围内.)但是,它不会可以在外面使用test.

  • @Wesley - 无论你是否在这个特定的实例中调用它都没关系.重要的是`init`函数是`test`构造函数的公共可访问成员,因此它的名称不能缩短/缩小,否则代码的使用者可能会尝试调用`new test().init() `并返回`undefined`. (2认同)
  • @Wesley,同样是Uglify也无法判断在使用"init"之后是否包含了另一个脚本. (2认同)