JavaScript压缩器应该自动合并变量声明吗?

3

我刚刚发现YUICompressor(2.4.7)不会合并变量声明。例如,

var x = 1;
var y = 2;

压缩为

var a=1;var b=2;

我认为,可以合理地期望一个压缩工具能够结合连续的var声明,就像这样:

var a=1,b=2;

我的真正问题是,是否合理并且可能(对于一个缩小器)自动安全地将单个函数中的非连续var声明组合起来?


它不一定会减小文件的gzipped大小,实际上可能会增加。如果没有组合,文本字符串“;var”将在所有地方高度压缩。在组合文本中,你会发现多了一个逗号。一些缩小工具进行了组合(例如Google Closure和Uglify)。 - Stephen Chung
2个回答

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

我知道一个例子,这种情况不是理想的。看看这个问题我是否已经达到了浏览器可以处理的JavaScript对象的大小限制?

那个问题涉及到一个变量在单个 var 语句中的初始化时出现的错误。该问题是关于将一个非常巨大的字面量分配给一个变量失败的问题。最终的解决方案是将对象拆分成单独的var声明。

因此,如果压缩程序总是这样做,那么你的代码更有可能遇到这种问题


如果我没记错的话,那不是关于单个“var”的问题,而是关于单个文字的问题。 - user166390
@pst,你记错了。我的原始建议是将声明拆分为单个var,然后连接数组。单个var语句仍然导致问题,最终的解决方案是将数组声明拆分为单独的var语句,然后连接数组。 - Ruan Mendes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接