为什么JavaScript压缩工具不这样做?

5
我一直想知道为什么js压缩器不这样做。假设我有一个像这样的压缩后的脚本:
(function($){var a=$("a");1<a.length&&10>a.length?alert(a.length):alert($("p").length)})(jQuery);

为什么它不能编译成类似这样的东西:
(function($,L){var a=$("a");1<a[L]&&10>a[L]?alert(a[L]):alert($("p")[L])})(jQuery,'length');

将每个出现的.property替换为[缩写键],并将字符串和参数接收器传递给iife(基本上就是我在上面使用.length所做的)。 想象一下,用159个.length,62个.each,15个.appendChild等可以压缩多少jQuery。仅仅是.length就可以节省超过600字节! 此外,使用上面的示例,为什么要浪费空间在var关键字上,当你可以通过声明另一个参数来保留该函数范围内的一个空间:
(function($,L,a){a=$("a");1<a[L]&&10>a[L]?alert(a[L]):alert($("p")[L])})(jQuery,'length');

还有一个问题,为什么不将整个jQuery放入一个eval中,以便节省其他572个function关键字(4.5k)?


我曾经手写JS,并且有时候仍然这样做。还在String.prototype中使用了一些技巧,比如IO=String.prototype.indexOf或者Us='undefined';Ss='string';Ow=window;,同时也定义了一个String.prototype.has(s)函数。 - Mark Robbins
3个回答

6
我想它不希望假设您需要在属性查找之外再进行变量查找的费用。
如果使用Closure编译器,则可以手动撤消这些类型的引用。
最终,如果您使用gzip,我认为这些混淆并不会增加太多。我不会惊讶地发现,在某些情况下,它实际上会使您的gzip版本更大。

5
因为这会改变代码的结构。你的提议不是操作对象的length属性的方法,而是提供了一个函数来访问任何传入的属性名——这可能与原始代码的意图相违背。
这样做可能会对性能产生影响,或者至少会导致某些JavaScript运行时优化无法使用。
还要注意,大多数JavaScript源文件应该通过GZip压缩(由大多数Web服务器/浏览器在HTTP级别进行协商和透明地完成),这将轻松压缩掉任何重复的名称实例,包括"var"和重用的属性名称。

我认为滥用该函数不是一个真正的理由。它是一个IIFE,因此只会被调用一次,并使用给定的任何参数。它应该能够在末尾添加参数和参数而没有影响。只需要小心确保每个参数和参数数量相等即可。 - user1106925
1
除非引用arguments对象,否则不会发生这种情况。 - user1106925
4
它还会让多余的变量漂浮在闭包中。 - jermel
@jermel:它们不会只是漂浮在周围。它们将成为代码的一个活动部分。这个想法是,任何使用“length”(例如)的嵌套代码都需要引用变量才能访问属性。 - user1106925

3
因为缩小器不应该改变代码功能,只能删除不必要的字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接