gpt4 book ai didi

javascript - Closure Compiler : @enum, 属性崩溃和 JSC_UNSAFE_NAMESPACE

转载 作者:行者123 更新时间:2023-11-29 15:33:55 25 4
gpt4 key购买 nike

初始情况

我有以下代码:

var NS = {};  // namespace

NS.myEnum = {
foo: 1,
bar: 2
};

var extendedNS = Object.create(NS);

extendedNS.myAlert = function (x) { alert(x); };

extendedNS.myAlert(extendedNS.myEnum.foo);

它使用此命令成功编译(没有警告或错误):

java -jar compiler-20150609.jar --js test.js --compilation_level ADVANCED --warning_level VERBOSE

问题1

根据docs for JSC_UNSAFE_NAMESPACE ,我认为高级优化可能会将 NS.myEnum 替换为 NS$myEnum,然后删除 NS

那么为什么编译器对这一行发出警告?

var extendedNS = Object.create(NS);

这不是对命名空间 NS 的不安全引用吗?编译器不应该警告:“为命名空间 NS 创建的别名不完整”

@enum 类型中断编译输出

我现在将 NS.myEnum 标记为枚举:

/**
* @enum {number}
*/
NS.myEnum = {
foo: 1,
bar: 2
};

根据 this old SO answer , “编译器希望将枚举值折叠成单个变量”。所以我认为编译器现在可能会将 NS.myEnum 折叠为:

NS$myEnum$foo = 1;
NS$myEnum$bar = 2;

编译器现在发出警告:

WARNING - incomplete alias created for namespace NS
var extendedNS = Object.create(NS);
^

我想我理解原因:高级优化可能在折叠枚举值后删除了 NS

编译后的输出确实有问题:

var a = Object.create({});
a.a = function() {
alert(a.c.b); // a.c.b doesn't exist, so a runtime error will occur
};
a.a();

问题2

我现在添加一个@nocollapse标记到枚举(“表示不应由编译器折叠到变量中的属性。如果您使用 @nocollapse 注释作为对象的属性,则其所有属性也将保留未折叠。”):

/**
* @enum {number}
* @nocollapse
*/
NS.myEnum = {
foo: 1,
bar: 2
};

编译输出现在是有效代码:

var a = Object.create({c:{a:1, f:2}});
a.b = function() {
alert(a.c.a); // a.c.a does exist
};
a.b();

但编译器仍会引发 JSC_UNSAFE_NAMESPACE 警告:

WARNING - incomplete alias created for namespace NS
var extended = Object.create(NS);
^

为什么?是否有我需要添加到 NS.myEnum 以防止出现此警告的另一个标记?

(注意:我不想@suppress警告。我想了解并修复警告的原因。)

最佳答案

核心问题归结为这样一个事实,即传统上,@enum 属性总是被折叠 - 因此当 @enum 注释被添加为代码时的警告可能是坏了(在你的第一个例子中)。

@nocollapse 确实会阻止枚举折叠,并且当存在该注释时可能会错误地发出警告。你可以file a bug如果您愿意,可以讨论这个问题,但这可能是一个低优先级的问题。

在一般情况下,枚举被设计为更像常量一样使用,因此将它们用作原型(prototype)对象不是预期/支持的行为。

有关属性(property)折叠的规则和案例很复杂。了解它们的最好方法是查看 unit tests查看触发警告的特定模式。

关于javascript - Closure Compiler : @enum, 属性崩溃和 JSC_UNSAFE_NAMESPACE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31598185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com