JavaScript迷你程序是否应该自动组合var声明?

JavaScript迷你程序是否应该自动组合var声明?,javascript,minify,hoisting,Javascript,Minify,Hoisting,我刚刚发现YUICompressor(2.4.7)没有组合var声明。比如说, var x = 1; var y = 2; 压缩到 var a=1;var b=2; 我认为有理由期望小型化程序能够组合连续的var声明,如下所示: var a=1,b=2; 但我真正的问题是,期望/可能(对于小型化者)在单个函数中自动、安全地组合非连续的var声明是否合理?我知道有一个例子不需要这样做。看到这个问题了吗 这个问题是关于一个bug的,当一个变量的初始化发生在一个var语句中时。问题是给一个失败的

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

var x = 1;
var y = 2;
压缩到

var a=1;var b=2;
我认为有理由期望小型化程序能够组合连续的var声明,如下所示:

var a=1,b=2;

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

我知道有一个例子不需要这样做。看到这个问题了吗

这个问题是关于一个bug的,当一个变量的初始化发生在一个
var
语句中时。问题是给一个失败的变量分配一个巨大的文本。最终的解决方案是将对象拆分为单独的var声明


因此,如果压缩器总是这样做,那将导致您的代码更有可能遇到此类问题,具体取决于。如果您谈论的是带有初始化的声明,那么:否

考虑这一点:

(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
属性,因此不会从缩微器中看到它。

IIRC不是关于单个
var
,而是关于单个文本。@pst,您记不清了。我最初的建议是使用单个
var
拆分声明,然后对数组进行压缩。单个var语句仍然会导致问题,最终的解决方案是将数组声明拆分为单独的
var
语句,然后对数组进行编码它不一定会减少文件的gzip大小,实际上可能会增加文件的gzip大小。如果没有组合,文本字符串“var”将被高度压缩。在合并后的文本中,到处都有一个额外的逗号。一些迷你们组合(例如,我认为Google Close和Uglify)。