如何强制谷歌闭包编译器保持"使用严格&#34 ;;在编译的js代码中?

时间:2010-12-16 16:32:51

标签: javascript google-closure google-closure-compiler ecmascript-5

如果您正在使用模块模式并且具有以下内容:

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

使用Google Closure Compiler编译代码,"use strict";指令不会进入编译文件。

那么如何防止Closure Compiler删除ES5 / strict指令?

(注意,我不想使用强制执行ES5 /严格模式的其他模式,即简单地将“use strict”;添加到编译文件的第一行。我想使用模块模式正如here所述。)

5 个答案:

答案 0 :(得分:51)

答案 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删除标签时,无论如何它都是有用的时代了。我相信他们会更新编译器,以便在该功能真正有用之前很久就保留标签。