如果您正在使用模块模式并且具有以下内容:
(function () {
"use strict";
// this function is strict...
}());
使用Google Closure Compiler编译代码,"use strict";
指令不会进入编译文件。
那么如何防止Closure Compiler删除ES5 / strict指令?
(注意,我不想使用强制执行ES5 /严格模式的其他模式,即简单地将“use strict”;添加到编译文件的第一行。我想使用模块模式正如here所述。)
答案 0 :(得分:51)
更新:编译器现在支持严格模式。
只需使用--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
答案 1 :(得分:9)
这不是最好的答案,但据我所知,这是封闭编译器的已知问题或“功能”(取决于您的观点)。这是所涉及的一些问题的partial explanation。提到的一点是,当组合多个文件时,无法保留文件级严格模式声明,并且编译器的函数内联功能将破坏函数级严格模式声明的范围。由于“使用严格”声明的行为在编译代码中是不可预测/错误的(当严格模式被误用于非严格代码时可能会破坏程序),编译器会像其他任何死代码一样剥离它们。
似乎有一个想法是在编译器中完全实现ECMAScript 5严格模式检查(在这种情况下,从编译代码中删除它没有任何缺点),但它还没有。
以SIMPLE_OPTIMIZATIONS
模式而不是ADVANCED_OPTIMIZATIONS
进行编译会禁用死代码删除,但我怀疑您已经知道了。
答案 2 :(得分:7)
的危险强> 的。高级模式下的Closure Compiler与不严格模式兼容,这意味着编译器将根据 ECMAScript 262 rev 3 规则重写代码。对于严格模式(例如,匿名函数中的“this”绑定,范围解析等),某些规则会发生变化,如果Closure Compiler由于错误的语言假设而错误地重写代码,则会导致代码破坏。
简短回答(以及Closure Compiler的官方回答)是:不要这样做。
如果您真的只想在那里铲“使用严格”字符串,请尝试:
eval('"use strict";');
答案 3 :(得分:0)
使用编译器的输出包装器来创建模块包装器并在那里包含“use strict”指令。
答案 4 :(得分:-1)
严格模式对于调试非常有用,除非它被广泛应用于每个主要浏览器,否则不会有太多其他模式。当Closure Compiler删除标签时,无论如何它都是有用的时代了。我相信他们会更新编译器,以便在该功能真正有用之前很久就保留标签。