1

一个显然总是错误的 if 语句,例如。if (false), 闭包删除语句。

我的代码如下所示:

if (settings.lang === "en"){
    lib.doSomething();
}

settings.lang是一个常数。

/** 
 * @type {string}
 * @const 
 */ 
settings.lang = "fr" ;  

因此,当它等于“fr”时,编译器可以在编译时删除if和 的定义lib.doSomething。但事实并非如此。有没有办法让它做到这一点?

在你问我为什么不只是删除该代码之前:对于其他客户,settings.lang 设置en.

4

3 回答 3

2

1)确保正确定义“设置”:

/** @const */
var settings = {};

2)确保正确定义“设置”语言:

/** @const */ 
settings.lang = "fr" ;

3)确保在定义后引用该值:

if (settings.lang == "en") ...

在高级模式下,如果未以防止属性折叠的方式使用设置(例如,将“设置”作为参数传递给函数将导致值转义并且不可折叠),则会内联并删除它。

如果您使用@define,这将被简化:

/** @const */
var settings = {};

/** @define {string} */
settings.lang = "fr";

如果定义的定义在某些方面无效,您应该收到警告。

于 2013-06-24T20:33:32.197 回答
1

听起来您正在使用一些编译模式(很可能是'SIMPLE'编译模式,因为这是plovr 中的默认值)而不是'ADVANCED'编译模式。高级编译模式是一种删除死代码的模式。

于 2013-06-18T02:43:00.883 回答
1

goog.LANG 是用 goog.define 定义的吗?最后我检查了 Plovr 与 goog.define 不兼容(它没有最新的编译器)确保你从 Closure Library 的兼容版本开始。

于 2013-06-18T15:33:58.080 回答