为什么Closure Compiler会覆盖一个简短的var ref。到'this'关键字并恢复'this'?

时间:2013-04-25 08:05:36

标签: javascript compression google-closure-compiler

我正在使用Google Closure Compiler测试一些代码并进行简单的优化,令我惊讶的是一个函数,例如:

window.navigator.detect = function() {
  var t = this,
  a = t.userAgent.toLowerCase(),
  match = /(chrome|webkit|firefox|msie)[ \/]([\w.]+)/.exec(a) ||
  /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a) ||
  a.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a) || [];

  t.ua = match[1] || false;
  t.vers = match[2] || "0";
  if (t.ua) t[match[1]] = true;
  if (match = t.msie)
  t.ie = parseInt(t.vers);//ie main version or false if not IE
  else if (t.chrome)
  t.webkit = true;
  else if (t.webkit)
  t.safari = true;
  //css prefix
  t.pre = t.webkit ? '-webkit-' : t.firefox ? '-moz-' : t.ie > 7 ? '-ms-' : t.opera ? '-o-' : '';
}
window.navigator.detect();

变成:

window.navigator.detect = function() {
  var a = this.userAgent.toLowerCase(), a = /(chrome|webkit|firefox|msie)[ \/]([\w.]+)/.exec(a) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a) || 0 > a.indexOf("compatible") && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a) || [];
  this.ua = a[1] || !1;
  this.vers = a[2] || "0";
  this.ua && (this[a[1]] = !0);
  this.msie ? this.ie = parseInt(this.vers) : this.chrome ? this.webkit = !0 : this.webkit && (this.safari = !0);
  this.pre = this.webkit ? "-webkit-" : this.firefox ? "-moz-" : 7 < this.ie ? "-ms-" : this.opera ? "-o-" : ""
};
window.navigator.detect();

我想使用较小的't'变量作为'this'的引用来保存一些字节而不是更长的'this'使用17次。在这种情况下,Closure Compiler使我的代码更长,这有点讽刺。不确定这是否有意。我没有在Google的文档中看到任何相关内容。

任何想法如何防止这种警告?

1 个答案:

答案 0 :(得分:1)

我自己发现了一些谷歌搜索... 答案类似于关于Closure Compiler内联字符串的问题:Variables in Google Closure

FAQ上的这个难题:

  

Closure Compiler内联我的所有字符串,这使我的代码大小   大。为什么会这样做?大多数人通过查看来比较代码大小   在两个未压缩的JavaScript文件中。但这是一种误导性的方式   查看代码大小,因为不应该提供JavaScript文件   解压缩。应该使用gzip压缩。“...”gzip   算法的工作原理是尝试在最优的位置对字节序列进行别名   办法。手动别名字符串几乎总是产生压缩代码   大小更大,因为它颠覆了gzip自己的别名算法。“

我尝试使用:window.navigator.detect(window.navigator);然后window.navigator.detect = function(t){}传递't'var作为函数参数,它保留一个简短的1字符变量。但是虽然它在'Compiled Size'上节省了27个字节,但'gzipped size'实际上更大了1个字节......

因此虽然这里并不完全是关于字符串的别名,但gzip的最终结果是相似的,并且应该是减小尺寸的主要问题。