Javascript 谷歌闭包编译器:如何保存缓存的代码;这是什么;? 介绍

Javascript 谷歌闭包编译器:如何保存缓存的代码;这是什么;? 介绍,javascript,this,google-closure-compiler,Javascript,This,Google Closure Compiler,我经常使用谷歌闭包编译器来压缩我的JavaScript文件。现在,它似乎可以很好地压缩我的代码 现在,我试着养成将this对象存储在局部变量中的习惯,因为this不能混淆,但局部变量肯定可以混淆。但是,Google Closure Compiler无法识别这一点,而是删除了局部变量的所有实例,并将其替换为this 关于优化。。。 我很清楚,在编写代码时应该避免预优化。但是,我觉得缓存这个是可以接受的,因为这样做可以提供清晰性(因为这个可以有很多上下文,用另一个名称引用它可以减少歧义) 例子 下面

我经常使用谷歌闭包编译器来压缩我的JavaScript文件。现在,它似乎可以很好地压缩我的代码

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

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

例子 下面的代码非常基本,我知道它可能写得不好。然而,代码将确切地说明我所面临的问题

以下是压缩前的原始源文件:

(function() {
  var that = this;
  that.a = 3;
  that.b = 4;
  this.c = 5;
  return that;
}());
现在这里是压缩的源文件。请注意,
this
that
的赋值已被删除

(function(){this.a=3;this.b=4;this.c=5;return this})();
理想情况下,我希望
的赋值保持某种形式,可能类似于:

(function(){var t=this;t.a=3;t.b=4;t.c=5;return t})();
现在,上面的代码几乎不保存任何字节,但是当使用一个更大的脚本时(就像我经常做的那样),节省的字节肯定会增加

问题:
简而言之,如何防止闭包编译器删除上述脚本中的
变量?

我想如果您确实需要,您可以这样做:

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

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

  • 减少代码的大小。一个单字母变量小于关键字this
  • 的理论。然而,这一理论在大多数情况下是有缺陷的。看

  • 防止关键字
    的上下文更改。但是,在简单的_优化中,这是不必要的。如果创建引用变量的内部闭包,编译器将不会内联该值。在高级_优化中,在原型函数或构造函数之外使用关键字
    this
    可能是危险的,应小心操作。看

  • 如果确实要防止编译器内联您的值,则需要使用引号语法将其作为属性添加到对象上:

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

    你为什么在乎?它大约有5-10个字节,不会产生任何影响,继续走。问得好,但为什么在原始源代码中使用这个变量呢?是否仅用于混淆?我将
    分配给变量,因为它提供了清晰性。毕竟,
    这个
    有很多上下文,所以用另一个名字来引用它可以减少歧义。如果你这样做是为了清晰,为什么你会在意它在优化后被删除?你说得很好;我想我只是想知道这些事情。那样的话,我就不需要任何帮助了。谢谢你的解释