JavaScript压缩工具是否应该自动合并变量声明?

8 浏览
0 Comments

JavaScript压缩工具是否应该自动合并变量声明?

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

var x = 1;
var y = 2;

压缩后的结果是

var a=1;var b=2;

我认为合理地期望一个压缩工具能够合并连续的变量声明,就像这样:

var a=1,b=2;

但我的真正问题是合理地期望/对于一个压缩工具来说,自动且安全地合并非连续的变量声明在一个函数中是否可行?

0
0 Comments

问题的出现原因是:在一个单独的var语句中初始化变量时,有一个bug。这个问题是关于将一个非常大的字面量赋值给一个变量,而这个赋值操作失败了。最后的解决方案是将对象分割成单独的var声明。

解决方法是:不要让压缩器自动合并var声明,以避免代码更容易遇到这种问题。

以下是对话内容的整理:

我知道有一个例子,这种情况下不希望自动合并var声明。参见这个问题:Have I reached the limits of the size of objects JavaScript in my browser can handle?

那个问题是关于一个bug,当一个变量的初始化发生在一个单独的var语句中时。问题是关于将一个非常大的字面量赋值给一个变量,但赋值操作失败了。最后的解决方案是将对象分割成单独的var声明。

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

我记得那不是关于单独的var,而是关于单独的字面量。

你记错了。我最初的建议是将声明分割成单独的var语句,然后将数组拼接起来。单个var语句仍然引起了问题,最后的解决方案是将数组声明分割成单独的var语句,然后将数组拼接起来。

0
0 Comments

JavaScript minifiers是用来压缩JavaScript代码的工具,它们通过移除空格、注释和不必要的字符来减小文件大小。然而,在压缩JavaScript代码时,是否应该自动合并var声明是一个有争议的问题。

如果var声明带有初始化值,那么自动合并是不安全的。在下面的代码中,第一个立即执行函数中的var声明会被提升到函数顶部,导致y在声明之前被使用,值为undefined。而第二个立即执行函数中的var声明则没有这个问题。

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

然而,如果var声明没有初始化值,自动合并是安全的。在下面的代码中,y在使用之前被声明,所以没有问题。

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

JavaScript minifiers通过在生成输出之前扫描整个函数来实现自动合并var声明,这是为了压缩变量名。但需要注意的是,如果函数的参数列表被扩展,完全消除var声明可以节省额外的字节,但这会改变函数的length属性,因此不能指望minifiers会这样做。

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

是否应该自动合并var声明取决于声明是否带有初始化值。如果有初始化值,自动合并是不安全的;如果没有初始化值,自动合并是安全的。但需要注意的是,如果函数的参数列表被扩展,完全消除var声明可能会改变函数的length属性。

0