How to force google closure compiler to keep "use strict"; in the compiled js code?

Update: strict mode is now supported in the compiler.

Just use --language_in=ECMASCRIPT5_STRICT.

References:

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


This isn't the greatest answer, but as far as I can tell this is a known issue or "feature" (depending on your perspective) of closure compiler. Here's a partial explanation of some of the problems involved. A couple mentioned are that there's no way to preserve file-level strict mode declarations when multiple files are combined, and the compiler's function inlining feature would break the scope of function-level strict mode declarations. Since the behavior of "use strict" declarations would be unpredictable/wrong in compiled code (potentially breaking programs when strict mode is misapplied to non-strict code), the compiler strips them like any other dead code.

There seems to have been an idea to fully implement ECMAScript 5 strict mode checks in the compiler (in which case there would be no downside to removing it from compiled code), but it's not there yet.

Compiling in SIMPLE_OPTIMIZATIONS mode instead of ADVANCED_OPTIMIZATIONS will disable dead code removal, but I suspect you already know that.


Dangerous. Closure Compiler in Advanced mode is not strict-mode compatible, which means that the compiler will rewrite code based on ECMAScript 262 rev 3 rules. Some rules are changed for strict-mode (e.g. "this" binding in anonymous functions, scope resolution etc.) that will cause code breakage if Closure Compiler rewrites code incorrectly due to wrong language assumptions.

The short answer (and the Closure Compiler's official answer) is: don't do it.

If you really just want to shovel a "use strict" string there, try:

eval('"use strict";');