【问题标题】:Should JavaScript minifiers automatically combine var declarations?JavaScript minifiers 是否应该自动组合 var 声明?
【发布时间】:2012-04-04 06:07:21
【问题描述】:

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

var x = 1;
var y = 2;

压缩成

var a=1;var b=2;

假设期望一个缩小器能够组合 连续 var 声明是合理的,如下所示:

var a=1,b=2;

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

【问题讨论】:

  • 它不一定会减小 gzipped 文件的大小,实际上可能会增加它。如果没有组合,文本字符串“;var”将被高度压缩。在组合文本中,到处都有一个额外的逗号。一些缩小器结合在一起(例如,我认为是 Google Closure 和 Uglify)。

标签: javascript minify hoisting


【解决方案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 属性,因此不会出现在 minifiers 中。

【讨论】:

    【解决方案2】:

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

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

    因此,如果压缩器总是这样做,那将导致您的代码更有可能遇到此类问题

    【讨论】:

    • IIRC 不是关于单个 var,而是单个文字。
    • @pst,你记错了。我最初的建议是使用单个 var 拆分声明,然后连接数组。单个 var 语句仍然会导致问题,最终的解决方案是将数组声明拆分为单独的 var 语句,然后连接数组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    相关资源
    最近更新 更多