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

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";添加到编译文件的第一行.我想使用此处所述的模块模式.)

joe*_*rdi 9

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

似乎有一个想法是在编译器中完全实现ECMAScript 5严格模式检查(在这种情况下,从编译代码中删除它没有任何缺点),但它还没有.

SIMPLE_OPTIMIZATIONS模式下编译而不是ADVANCED_OPTIMIZATIONS禁用死代码删除,但我怀疑你已经知道了.

  • 更新:Ben Challenor的答案似乎是新的"正确"答案. (3认同)

Ste*_*ung 8

危险.高级模式下的Closure Compiler不是严格模式兼容的,这意味着编译器将根据 ECMAScript 262 rev 3规则重写代码.对于严格模式(例如,匿名函数中的"this"绑定,范围解析等),某些规则会发生更改,如果Closure Compiler因错误的语言假设而错误地重写代码,则会导致代码破坏.

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

如果你真的只想在那里铲"使用严格"字符串,请尝试:

eval('"use strict";');
Run Code Online (Sandbox Code Playgroud)