Должны ли минификаторы JavaScript автоматически объединять объявления var? - PullRequest
3 голосов
/ 19 марта 2012

Я только что обнаружил, что YUICompressor (2.4.7) не объединяет объявления var.Например,

var x = 1;
var y = 2;

сжимается до

var a=1;var b=2;

I Предположим, было бы разумно ожидать, что минификатор сможет комбинировать последовательных объявления var, вот так:

var a=1,b=2;

Но мой реальный вопрос: Разумно ли ожидать / возможно (для минификатора) автоматически и безопасно объединять непоследовательные объявления var в одной функции

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

Это зависит. Если вы говорите об объявлениях с инициализацией, то: Нет.

Учтите это:

(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 (редко используемое) функции и, следовательно, не ожидается от минифайеров.

1 голос
/ 19 марта 2012

Я знаю один пример, где это было бы нежелательно. См. Этот вопрос Достигли ли я ограничения по размеру объектов, которые может обрабатывать JavaScript в моем браузере?

Этот вопрос касался ошибки, когда инициализация переменной произошла в одном операторе var. Вопрос был в том, чтобы присвоить действительно гигантский литерал переменной, которая потерпела неудачу. В конце концов, решение было разделить объект на отдельные объявления var.

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

...