【问题标题】:How to force google closure compiler to keep "use strict"; in the compiled js code?如何强制谷歌闭包编译器保持“使用严格”;在编译的js代码中?
【发布时间】:2011-05-26 16:04:46
【问题描述】:

如果你正在使用模块模式并且有这样的东西:

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

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

那么如何防止闭包编译器删除 ES5/strict 指令?

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 有注释吗?
      • 从初步调查来看,闭包编译器似乎不会剥离不必要的“use strict”;此模式下连接文件中的语句...值得注意
      • 它似乎还会在顶部添加'use strict';,如果它还没有的话。整洁!
      • 在我的情况下,只需添加--language_out=ECMASCRIPT5_STRICT,最后的缩小包括'use strict';
      【解决方案3】:

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

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

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

      eval('"use strict";');
      

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 更新:Ben Challenor 下面的答案似乎是新的“正确”答案。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-10
          • 1970-01-01
          相关资源
          最近更新 更多