【问题标题】:Google Closure Compiler: How to preserve code that caches "this"?Google Closure Compiler:如何保留缓存​​“this”的代码?
【发布时间】:2013-01-08 02:34:13
【问题描述】:

简介

我经常使用 Google Closure Compiler 来压缩我的 JavaScript 文件。现在,它似乎很好地压缩了我的代码。

现在,我尝试养成将this 对象存储在局部变量中的习惯,因为this 不能被混淆,但局部变量当然可以被混淆。但是,Google Closure Compiler 无法识别这一点,而是删除了局部变量的所有实例,将其替换为 this

关于优化...

我很清楚在编写代码时应该避免预先优化。但是,我觉得缓存 this 是可以接受的,因为这样做可以提供清晰性(因为 this 可以有很多上下文,并且用另一个名称引用它会减少歧义)。

示例

下面的代码非常基本,我知道它可能写得不好。但是,代码将准确地展示我所面临的问题。

这是压缩前的原始源文件:

(function() {
  var that = this;
  that.a = 3;
  that.b = 4;
  this.c = 5;
  return that;
}());

现在这里是压缩的源文件。请注意,thisthat 的分配已被删除。

(function(){this.a=3;this.b=4;this.c=5;return this})();

理想情况下,我希望that 的分配保持某种形式,可能类似于以下内容:

(function(){var t=this;t.a=3;t.b=4;t.c=5;return t})();

现在,上面的代码几乎没有节省任何字节,但是当使用更大的脚本时(就像我经常做的那样),节省的钱肯定会加起来。

问题

简而言之,如何防止 Closure Compiler 删除上述脚本中的 that 变量?

【问题讨论】:

  • 你为什么在乎?大约 5-10 字节,没有任何影响,继续走。
  • 问得好,但是你为什么要在原始源代码中使用那个变量呢?只是为了混淆?
  • 我将this 分配给一个变量,因为它提供了清晰性。毕竟,this 有很多上下文,所以用另一个名字引用它可以减少歧义。
  • 如果你是为了清楚起见,你为什么关心优化后它被删除?
  • 你说得很好;我想我只是想知道这些事情。在那种情况下,我不需要任何帮助。谢谢你的理由。 ;)

标签: javascript this google-closure-compiler


【解决方案1】:

您试图超越编译器。这是一场失败的战斗。然而,这是人们尝试做这类事情的两个主要原因。

  1. 减小代码大小。理论是单个字母变量小于关键字this。然而,这个理论在大多数情况下是有缺陷的。见the compiler FAQ

  2. 防止关键字this 的上下文发生变化。但是,在 SIMPLE_OPTIMIZATIONS 中这是不必要的。如果创建引用变量的内部闭包,编译器将不会内联该值。在 ADVANCED_OPTIMIZATIONS 下,使用关键字 this 在原型函数或构造函数之外可能是危险的,应该小心操作。见an article explaining why

如果你真的想阻止编译器内联你的值,你需要使用带引号的语法将它作为属性添加到对象上:

(function() {
  var config = {};
  config['that'] = this;
})()

【讨论】:

    【解决方案2】:

    我想如果你真的需要你可以这样做:

    (function() {
      var that = this || 1;
      that.a = 3;
      that.b = 4;
      this.c = 5;
      return that;
    }());
    

    【讨论】:

      猜你喜欢
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 2011-05-12
      相关资源
      最近更新 更多