Google Closure编译器:如何保存缓存“this”的代码?

时间:2013-01-08 02:34:13

标签: javascript this google-closure-compiler

简介

我经常使用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变量?

2 个答案:

答案 0 :(得分:2)

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

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

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

  3. 如果您真的想阻止编译器内联您的值,您需要使用引用语法将其作为属性添加到对象中:

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

答案 1 :(得分:0)

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

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