我经常使用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;
}());
现在这里是压缩的源文件。请注意,this
到that
的分配已被删除。
(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
变量?
答案 0 :(得分:2)
您正试图超越编译器。这是一场失败的战斗。然而,这是人们尝试做这类事情的两个主要原因。
减少代码的大小。理论是单个字母变量小于关键字this
。然而,在大多数情况下,这种理论存在缺陷。请参阅the compiler FAQ。
防止关键字this
的上下文发生变化。但是,在SIMPLE_OPTIMIZATIONS中,这是不必要的。如果创建引用变量的内部闭包,则编译器不会内联该值。在ADVANCED_OPTIMIZATIONS下,使用关键字this
在原型函数或构造函数之外可能是危险的,应该小心处理。请参阅an article explaining why。
如果您真的想阻止编译器内联您的值,您需要使用引用语法将其作为属性添加到对象中:
(function() {
var config = {};
config['that'] = this;
})()
答案 1 :(得分:0)
我想如果你真的需要,你可以这样做:
(function() {
var that = this || 1;
that.a = 3;
that.b = 4;
this.c = 5;
return that;
}());