Этот MWE показывает, как компилятор Google Closure заменяет короткий obj[keyA]
на более длинный obj["some-very-long-key"]
:
Входной JavaScript:
var foo = new function() {
var keyA = 'some-very-long-key';
var keyB = 'another-key';
this.bar = function() {
obj[keyA] = {};
}
this.baz = function(data) {
obj[keyA][keyB] = data;
}
}();
Google Closureвывод компилятора:
var foo = new function() {
this.bar = function() {
obj["some-very-long-key"] = {};
};
this.baz = function(a) {
obj["some-very-long-key"]["another-key"] = a;
};
};
Если я удалю функцию обтекания, будет работать так, как я ожидал, до :
Входной JavaScript:
var keyA = 'some-very-long-key';
var keyB = 'another-key';
function bar() {
obj[keyA] = {};
}
function baz(data) {
obj[keyA][keyB] = data;
}
Вывод компилятора Google Closure:
var keyA = "some-very-long-key", keyB = "another-key";
function bar() {
obj[keyA] = {};
}
function baz(a) {
obj[keyA][keyB] = a;
}
;
Поскольку я часто использую длинный ключ в своем проекте, код становится больше, чем мог бы быть, если компилятор Google Closure сохранил строковый литералв переменной.
- Что вызывает такое поведение?
- Как мне получить строковый литерал для хранения внутри переменной и использовать эту переменную (которая имеет более короткое имя) в качестве индекса, сохраняя все это внутри конструктора?
Обновление 1: Я знаю, что мой требуемый результат мог бы быть немного хуже, но я бы предпочел взятьгораздо более короткий код.