引言
我经常使用谷歌闭包编译器来压缩我的JavaScript文件。现在,它似乎很好地压缩了我的代码。
然而,谷歌闭包编译器没有识别到这一点,而是删除了本地变量的所有实例,并将其替换为this。
关于优化...
我很清楚在编写代码时应该避免预优化。但是,我觉得缓存this是可以接受的,因为这样做可以提供清晰度(因为this可以有很多上下文,用另一个名称引用它可以减少歧义)。
示例
下面的代码非常基础,我知道它可能写得很差。然而,代码将确切地演示我所面临的问题。
以下是压缩前的原始源文件:
(function() {
var that = this;
that.a = 3;
that.b = 4;
this.c = 5;
return that;
}());下面是压缩后的源文件。请注意,向that分配this的操作已被删除。
(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})();问题
简而言之,如何防止闭包编译器删除上述脚本中的that变量?
发布于 2013-01-08 22:21:34
你正试图胜过编译器。这是一场失败的战斗。然而,这是人们尝试做这类事情的两个主要原因。
this小。然而,这个理论在大多数情况下是有缺陷的。参见the compiler FAQ.this from changing。但是,在SIMPLE_OPTIMIZATIONS中这是不必要的。如果创建引用变量的内部闭包,编译器将不内联值。在ADVANCED_OPTIMIZATIONS下,在原型函数或构造函数之外使用关键字this可能是危险的,应该小心使用。请参阅an article explaining why.如果你真的想阻止编译器内联你的值,你需要使用带引号的语法将它作为一个属性添加到一个对象上:
(function() {
var config = {};
config['that'] = this;
})()发布于 2013-01-08 13:18:14
我想如果你真的必须这样做,你可以这样做:
(function() {
var that = this || 1;
that.a = 3;
that.b = 4;
this.c = 5;
return that;
}());https://stackoverflow.com/questions/14207380
复制相似问题