2012-03-19 45 views
2

我刚刚发现YUICompressor(2.4.7)没有组合var声明。例如,JavaScript缩小器应该自动组合var声明吗?

var x = 1; 
var y = 2; 

压缩到

var a=1;var b=2; 

承担我们有理由期待一个minifier能够结合连续 VAR的声明,就像这样:

var a=1,b=2; 

但我真正的问题是是否合理预期/可能(对于mi nifier)自动并安全地将非连续的var声明组合到一个函数中?

+0

它可能不一定会减少** gzipped **大小的文件,并可能实际上*增加*它。如果没有组合,文本字符串“; var”将被高度压缩到所有地方。在组合文本中,你有一个额外的逗号。一些缩小词组合(例如,我认为Google Closure和Uglify)。 – 2012-03-20 04:19:36

回答

1

这要看情况。如果你正在使用的初始化,然后谈论声明:号

考虑一下:

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

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

但是,以下是安全的,应由minifiers做到:

(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

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

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

因此,如果压缩机总是这样做,会导致你的代码更容易碰上那样的问题

+0

IIRC不是一个'var',而是一个单一的文字。 – 2012-03-19 18:18:49

+0

@pst,你记不清了。我最初的建议是用一个'var'拆分声明,然后将数组连接起来。单个var语句仍然导致了这个问题,最后的解决方案是将数组声明分成单独的'var'语句,然后将数组 – 2012-03-19 18:24:32