JavaScript minifiers会自动组合var声明吗?

时间:2012-03-19 18:11:49

标签: javascript minify hoisting

我刚刚发现YUICompressor(2.4.7)没有组合var声明。例如,

var x = 1;
var y = 2;

压缩到

var a=1;var b=2;

假设期望minifier能够组合连续的 var声明是合理的,如下所示:

var a=1,b=2;

但我真正的问题是期望/可能(对于缩小器)在单个函数中自动安全地组合非连续var声明是否合理?

2 个答案:

答案 0 :(得分: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语句来节省额外的字节:

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

但是,这会更改函数(很少使用)length属性,因此不会出现缩小器的预期。

答案 1 :(得分:1)

我知道一个例子,这是不可取的。请参阅此问题Have I reached the limits of the size of objects JavaScript in my browser can handle?

这个问题是关于变量初始化发生在单个var语句中的错误。问题是关于为失败的变量分配一个非常巨大的文字。最后的解决方案是将对象拆分为单独的var声明。

因此,如果压缩器总是这样做,那么会导致代码更容易遇到这种问题