2012-01-15 46 views
5

我總是想知道爲什麼js壓縮機不這樣做。比方說,我有這樣一個縮小的腳本:爲什麼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前面所做的那樣)想象一下,多少這將運行如下的jQuery 159 .length,62 .each,15 .appendChild等。僅僅.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)?

+0

我曾經手寫過這樣的JS,有時候還是這樣。還可以使用String.prototype.IO = String.prototype.indexOf或Us ='undefined'; Ss ='string'; Ow = window;和String.prototype.has(s) – 2012-01-15 04:22:40

回答

6

我會想象它不想假設除了屬性查找以外,還需要花費變量查找。

如果你使用Closure編譯器,它實際上會撤消這些類型的引用,如果你手動做。

最終,如果你是gzip,我不認爲這些混淆加起來很多。如果在某些情況下它實際上會讓你的gzip版本變大,我不會感到驚訝。

5

因爲它會改變代碼的結構。您的提案現在提供了一個函數,用於允許訪問任何傳入的屬性名稱,這可能違背了原始代碼的意圖,而不是具有對對象的length屬性進行操作的方法。

這樣做也可能會影響性能 - 或者至少,這可能會導致JavaScript運行時的某些優化無法使用。

還要記住,大多數JavaScript源文件應該通過GZip壓縮(大多數Web服務器/瀏覽器在HTTP級別透明協商並完成) - 這將輕鬆壓縮任何名稱的任何重複實例,包括「var 「並重新使用屬性名稱。

+0

我不認爲誤用這個函數真的是一個原因。這是一個IIFE,所以只有在給出任何參數的情況下才會調用它。它應該能夠將參數和參數添加到最後而沒有衍生。它只需要小心,每一個都有相同的數量。 – 2012-01-15 03:17:21

+1

...除非引用'arguments'對象。 – 2012-01-15 03:18:42

+4

它也會在閉包時留下額外的變量 – jermel 2012-01-15 03:32:50

3

因爲縮小器不應該更改代碼功能,所以只能刪除不必要的字符。