32

如果您使用的是模块模式并且有这样的东西:

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

并使用 Google Closure Compiler 编译代码,该"use strict";指令不会将其放入编译文件中。

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

(请注意,我不想使用强制 ES5/strict 模式的其他模式,即简单地将“use strict”添加到编译文件的第一行。我想使用这里描述的模块模式.)

4

5 回答 5

53

更新:编译器现在支持严格模式。

只需使用--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

于 2011-07-16T16:35:30.240 回答
10

这不是最好的答案,但据我所知,这是闭包编译器的一个已知问题或“功能”(取决于您的观点)。以下是对所涉及的一些问题的部分解释。提到的一对夫妇是,当多个文件组合在一起时,无法保留文件级严格模式声明,并且编译器的函数内联功能会破坏函数级严格模式声明的范围。由于“使用严格”声明的行为在编译代码中是不可预测的/错误的(当严格模式被误用到非严格代码时可能会破坏程序),编译器像任何其他死代码一样剥离它们。

似乎已经有了在编译器中完全实现 ECMAScript 5 严格模式检查的想法(在这种情况下,将其从已编译代码中删除不会有不利影响),但目前还没有。

SIMPLE_OPTIMIZATIONS以模式而不是编译ADVANCED_OPTIMIZATIONS将禁用死代码删除,但我怀疑您已经知道这一点。

于 2011-01-03T05:20:03.240 回答
8

危险。高级模式下的闭包编译器兼容严格模式,这意味着编译器将根据ECMAScript 262 rev 3规则重写代码。某些规则已针对严格模式(例如匿名函数中的“this”绑定、范围解析等)进行了更改,如果 Closure Compiler 由于错误的语言假设而错误地重写代码,则会导致代码损坏。

简短的回答(以及 Closure Compiler 的官方回答)是:不要这样做。

如果你真的只是想在那里铲一个“使用严格”的字符串,试试:

eval('"use strict";');
于 2011-03-10T03:10:01.613 回答
1

您可以使用编译器的输出包装器来创建模块包装器并在其中包含“use strict”指令。

于 2011-02-09T00:16:26.560 回答
0

严格模式对调试很有用,在它被每个主要浏览器采用之前,它并没有多大用处。当 Closure Compiler 移除标签时,它的有用时代已经结束了。我相信他们会更新编译器,以便在该功能真正有用之前很久就保留标签。

于 2010-12-16T18:25:37.823 回答