首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google Closure Compiler:如何保存缓存"this“的代码?

Google Closure Compiler:如何保存缓存"this“的代码?
EN

Stack Overflow用户
提问于 2013-01-08 10:34:13
回答 2查看 666关注 0票数 3

引言

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

然而,谷歌闭包编译器没有识别到这一点,而是删除了本地变量的所有实例,并将其替换为this

关于优化...

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

示例

下面的代码非常基础,我知道它可能写得很差。然而,代码将确切地演示我所面临的问题。

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

代码语言:javascript
复制
(function() {
  var that = this;
  that.a = 3;
  that.b = 4;
  this.c = 5;
  return that;
}());

下面是压缩后的源文件。请注意,向that分配this的操作已被删除。

代码语言:javascript
复制
(function(){this.a=3;this.b=4;this.c=5;return this})();

理想情况下,我希望对that的赋值保持某种形式,可能类似于:

代码语言:javascript
复制
(function(){var t=this;t.a=3;t.b=4;t.c=5;return t})();

问题

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-08 22:21:34

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

  1. 减少了代码的大小。其原理是,单个字母变量比关键字this小。然而,这个理论在大多数情况下是有缺陷的。参见the compiler FAQ.
  2. Prevent the context of the context of the keyword this from changing。但是,在SIMPLE_OPTIMIZATIONS中这是不必要的。如果创建引用变量的内部闭包,编译器将不内联值。在ADVANCED_OPTIMIZATIONS下,在原型函数或构造函数之外使用关键字this可能是危险的,应该小心使用。请参阅an article explaining why.

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

代码语言:javascript
复制
(function() {
  var config = {};
  config['that'] = this;
})()
票数 2
EN

Stack Overflow用户

发布于 2013-01-08 13:18:14

我想如果你真的必须这样做,你可以这样做:

代码语言:javascript
复制
(function() {
  var that = this || 1;
  that.a = 3;
  that.b = 4;
  this.c = 5;
  return that;
}());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14207380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档