29

Если вы используете шаблон модуля и иметь что-то вроде этого:Как заставить компилятор закрытия Google держать «использовать строгий»; в скомпилированном js-коде?

(function() { 
    "use strict"; 
    // this function is strict... 
}()); 

и скомпилировать код, используя Google Closure Compiler, то "use strict"; директива не будет делать это в скомпилированный файл.

Итак, как вы препятствуете компилятору Closure удалить директиву ES5/strict?

(Обратите внимание, что я не хочу использовать другой режим принудительного использования режима ES5/strict, который заключается в том, чтобы просто добавить «использовать строгий» в первую строку скомпилированного файла. Я хочу использовать модуль как описано here.)

ответ

9

Это не самый лучший ответ, но насколько я могу судить, это известная проблема или «функция» (в зависимости от вашей перспективы) компилятора закрытия. Вот некоторые из проблем, связанных с проблемой: partial explanation. Пара упомянутых - это то, что невозможно сохранить декларации строгого режима на уровне файлов, когда несколько файлов объединены, а функция встроенной функции компилятора приведет к нарушению объема деклараций строгого режима на уровне функций. Поскольку поведение объявлений «use strict» было бы непредсказуемым/неправильным в скомпилированном коде (потенциально прерывая программы, когда строгий режим неверно используется для нестрого кода), компилятор разбивает их как любой другой мертвый код.

Возможно, возникла идея полностью реализовать проверки в строгом режиме ECMAScript 5 в компиляторе (в этом случае не было бы недостатка, чтобы удалить его из скомпилированного кода), но его пока нет.

Компиляция в SIMPLE_OPTIMIZATIONS режиме вместо ADVANCED_OPTIMIZATIONS отключит удаление мертвого кода, но я подозреваю, что вы уже это знаете.

+3

Обновление: ответ Бен Challenor в ниже, кажется, новый "правильный" ответ. – 2012-09-24 18:56:39

-1

Строгий режим полезен для отладки, и не так много, пока не увидит принятие в каждом крупном браузере. К тому времени, когда Closure Compiler удаляет тег, эра полезности в любом случае закончена. Я уверен, что они обновят компилятор, чтобы обеспечить сохранение тега задолго до того, как эта функция будет действительно полезной.

0

Вы используете компиляторную оболочку вывода для создания обертки модуля и включаете там директиву «use strict».

7

Опасный. Closure Compiler в расширенном режиме не совместим с жестким режимом, что означает, что компилятор перепишет код на основе ECMAScript 262 rev 3 правил. Некоторые правила изменяются для строгого режима (например, «эта» привязка в анонимных функциях, разрешении области видимости и т. Д.), Что приведет к поломке кода, если Closure Compiler неправильно переписывает код из-за неправильных предположений языка.

Короткий ответ (и официальный ответ компилятора Closure): не делайте этого.

Если вы действительно просто хотите перелопатить «использовать строгий» строку там, попробуйте:

eval('"use strict";'); 
+3

+1 для опасного обходного пути. – 2012-03-23 01:06:31

50

Обновление: строгий режим теперь поддерживается компилятором.

Просто используйте --language_in=ECMASCRIPT5_STRICT.

Ссылки:

http://code.google.com/p/closure-compiler/issues/detail?id=69

http://code.google.com/p/closure-compiler/source/detail?r=873

http://code.google.com/p/closure-compiler/source/detail?r=1114

+0

Есть ли аннотация для этого? – ryanve 2012-08-29 22:08:28

 Смежные вопросы

  • Нет связанных вопросов^_^