Компилятор закрытия Google не удаляет недостижимый код, помеченный аннотацией @define

Почему этот код не приводит к пустой строке после компиляции с SIMPLE_OPTIMIZATIONS

/**
 * @define {boolean}
 */
var TEST = false;
(function() {
    if (TEST) {
        foo();
    }
})();

а вместо этого я получаю следующее?

var TEST=!1;(function(){TEST&&foo()})();

if недоступен, но компилятор замыкания не удаляет код.
С «расширенными оптимизациями» результат такой, как я ожидаю (пусто), но «простые оптимизации» дают вышеуказанный результат. Почему эта разница? Код никогда не будет выполнен в обоих случаях.

EDIT:
Если я удалю замыкание, блок if тоже будет удален. Почему при замыкании этого не происходит?


person raxell    schedule 20.10.2015    source источник


Ответы (1)


Я считаю, что это было бы удалено при использовании «расширенных оптимизаций».

person MatrixFrog    schedule 20.10.2015
comment
Да, но почему с помощью простых оптимизаций код не удаляется? - person raxell; 21.10.2015
comment
Ну, потому что это оптимизация, которая считается продвинутой :) Честно говоря, я не уверен, как именно было определено разделение на простое/расширенное. - person MatrixFrog; 22.10.2015
comment
Простые оптимизации выполняют только локальные оптимизации (только значения внутри функции или выражения). Глобальные значения не перемещаются, не встраиваются и т. д. Это просто в том смысле, что вам не нужно соответствовать какому-либо конкретному стилю кодирования, чтобы оно работало. Расширенный режим отличается: если вы что-то не экспортируете, компилятор пытается это удалить. Это может сломать код с внешними ссылками на него. - person John; 26.10.2015