Должны ли минификаторы JavaScript автоматически объединять объявления var?
Я только что обнаружил, что YUICompressor (2.4.7) не объединяет объявления var. Например,
var x = 1;
var y = 2;
сжимает до
var a=1;var b=2;
Я предполагаю, что было бы разумно ожидать, что минификатор сможет комбинировать последовательные объявления var, например:
var a=1,b=2;
Но мой реальный вопрос: разумно ли ожидать / возможно (для минификатора) автоматически и безопасно объединять непоследовательные объявления var в одной функции?
2 ответа
Это зависит. Если вы говорите об объявлениях с инициализацией, то: Нет.
Учти это:
(function () {
var x = 1;
console.log(y); // undefined
var y = 2;
})();
(function () {
var x = 1, y = 2;
console.log(y); // 2
})();
Однако следующее безопасно и должно быть выполнено минифайерами:
(function () {
var x = 1, y;
console.log(y); // undefined
y = 2;
})();
Это конечно возможно; компрессор сканирует всю функцию на предмет наличия var
заявления до генерации продукции. Это необходимо для сжатия имен переменных.
Обратите внимание, что существует один возможный хитрый вариант, который заключается в расширении списка параметров и, таким образом, сохранении дополнительных байтов путем полного исключения любых var
заявления:
(function (x,y) {
x = 1;
console.log(y); // undefined
y = 2;
})();
Однако это меняет функцию (редко используется) length
собственности и, следовательно, не следует ожидать от minifiers.
Я знаю один пример, где это было бы нежелательно. Посмотрите этот вопрос. Достигли ли я предела размера объектов, которые JavaScript может обрабатывать в моем браузере?
Этот вопрос был об ошибке, когда инициализация переменной произошла в одном var
заявление. Вопрос был в том, чтобы присвоить действительно гигантский литерал переменной, которая потерпела неудачу. В конце концов, решение было разделить объект на отдельные объявления var.
Следовательно, если компрессоры всегда так делают, это может привести к тому, что ваш код с большей вероятностью столкнется с такой проблемой.