gpt4 book ai didi

javascript - 谷歌闭包编译器 : How to preserve code that caches "this"?

转载 作者:行者123 更新时间:2023-11-29 14:58:23 25 4
gpt4 key购买 nike

简介

我经常使用 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 编译器删除我上面脚本中的 that 变量?

最佳答案

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

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

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

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

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

关于javascript - 谷歌闭包编译器 : How to preserve code that caches "this"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14207380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com