我总是想知道为什么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
改变[minified key]
的每一次出现,并将字符串和arg接收器传递给iife
(基本上我在.length
上做了什么)< / p>
想象一下,如果用159 .length
,62 .each
,15 .appendChild
等来缩小jQuery的程度,只需.length
s就可以节省超过600个字节!< / p>
同样使用上面的示例,当您可以通过声明另一个参数来保留该函数范围中的空间时,为什么它会浪费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)?
答案 0 :(得分:6)
我认为除了属性查找之外,它不想假设你想要变量查找的费用。
如果您使用Closure Compiler,如果您手动执行它,它实际上会撤消这些类型的引用。
最终,如果你gzip,我不认为这些混淆加起来很多。如果在某些情况下它实际上使你的gzip版本更大,我不会感到惊讶。
答案 1 :(得分:5)
因为它会改变代码的结构。您的提案现在提供的函数允许访问任何传入的属性名称,而不是使用对象的length
属性进行操作的方法,而这可能违反原始代码的意图。
执行此操作可能还会对性能产生影响 - 或者至少,这可能会导致JavaScript运行时中的某些优化无法使用。
还要记住,大多数JavaScript源文件应该通过GZip压缩(大多数Web服务器/浏览器在HTTP级别透明地协商和完成) - 这将轻松压缩任何名称的任何重复实例,包括“var”和重用的财产名称。
答案 2 :(得分:3)
因为minifiers不应该更改代码功能,只删除不必要的字符。