2012-01-15 3 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 байт!

Кроме того, используя вышеприведенный пример почему это тратить место на вар ключевое слово, когда вы можете зарезервировать место в том, что функции сферы, объявив еще один параметр:

(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) –

ответ

6

Я бы предположил, что он не хочет предполагать, что вы хотите потратить переменный поиск в дополнение к поиску свойств.

Если вы используете компилятор Closure, он фактически отменяет эти типы ссылок, если вы сделаете это вручную.

В конечном счете, если вы gzip, я не думаю, что эти обфускации много. Я не удивлюсь, если в некоторых случаях это сделает вашу версию gzipped более крупной.

5

Потому что это изменит структуру кода. Вместо того, чтобы иметь метод, который работает с объектами length, ваше предложение теперь предоставляет функцию, которая позволяет получить доступ к любому имени свойства переданного объекта, что может быть против намерения исходного кода.

Для этого могут быть последствия для производительности - или, по крайней мере, это может привести к невозможности использования определенных оптимизаций в среде исполнения JavaScript.

Также имейте в виду, что большинство исходных файлов JavaScript должны проходить через сжатие GZip (согласовано и сделано прозрачно на уровне HTTP большинством веб-серверов/браузеров), что легко сжимает любые повторяющиеся экземпляры любых имен, включая «var "и повторно используемые имена свойств.

+0

Я не думаю, что неправильное использование функции действительно было бы причиной. Это IIFE, поэтому он вызывается только один раз с любыми аргументами. Он должен иметь возможность добавлять параметры и аргументы до конца без разветвления. Просто нужно быть осторожным, чтобы было равное количество каждого. –

+1

... если, возможно, не указан объект 'arguments'. –

+4

это также оставило бы дополнительные переменные, плавающие вокруг для закрытия – jermel

3

Поскольку minifiers не должны изменять функциональность кода, удалите ненужные символы.

Смежные вопросы