Должны ли минификаторы 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.

Следовательно, если компрессоры всегда так делают, это может привести к тому, что ваш код с большей вероятностью столкнется с такой проблемой.

Другие вопросы по тегам