ivo*_*ivo 30 javascript google-closure google-closure-compiler ecmascript-5
如果您正在使用模块模式并具有以下内容:
(function () {
"use strict";
// this function is strict...
}());
Run Code Online (Sandbox Code Playgroud)
并使用Google Closure Compiler编译代码,该"use strict";指令不会使其进入编译文件.
那么如何防止Closure Compiler删除ES5/strict指令呢?
(注意,我不想使用强制执行ES5 /严格模式的其他模式,即简单地将"use strict";添加到编译文件的第一行.我想使用此处所述的模块模式.)
Ben*_*nor 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
这不是最好的答案,但据我所知,这是封闭编译器的已知问题或"功能"(取决于您的观点).以下是对所涉及的一些问题的部分解释.提到的一点是,当组合多个文件时,无法保留文件级严格模式声明,并且编译器的函数内联功能将破坏函数级严格模式声明的范围.由于"使用严格"声明的行为在编译代码中是不可预测/错误的(当严格模式被误用于非严格代码时可能会破坏程序),编译器会像任何其他死代码一样剥离它们.
似乎有一个想法是在编译器中完全实现ECMAScript 5严格模式检查(在这种情况下,从编译代码中删除它没有任何缺点),但它还没有.
在SIMPLE_OPTIMIZATIONS模式下编译而不是ADVANCED_OPTIMIZATIONS禁用死代码删除,但我怀疑你已经知道了.
危险.高级模式下的Closure Compiler不是严格模式兼容的,这意味着编译器将根据 ECMAScript 262 rev 3规则重写代码.对于严格模式(例如,匿名函数中的"this"绑定,范围解析等),某些规则会发生更改,如果Closure Compiler因错误的语言假设而错误地重写代码,则会导致代码破坏.
简短的回答(以及Closure Compiler的官方回答)是:不要这样做.
如果你真的只想在那里铲"使用严格"字符串,请尝试:
eval('"use strict";');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7676 次 |
| 最近记录: |