1

我正在使用带有简单优化的 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 次。在这种情况下,闭包编译器会使我的代码更长,这有点讽刺。不确定这是否是有意的。而且我在 Google 的文档中看不到任何相关内容。

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

4

1 回答 1

1

我自己发现了一些更多的谷歌搜索......答案类似于关于闭包编译器内联字符串的这个问题:Google Closure中的变量

而这个常见问题解答难题:

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

我尝试使用: 将 't' var 作为函数参数传递window.navigator.detect(window.navigator);,然后window.navigator.detect = function(t){}保留一个短的 1 字符变量。但是,虽然它在“编译大小”上节省了 27 个字节,但“压缩大小”实际上大了 1 个字节......

因此,虽然这里不完全是关于字符串的别名,但 gzip 的最终结果是相似的,并且应该是减少大小方面的主要关注点。

于 2013-04-25T09:39:08.980 回答