gpt4 book ai didi

javascript - Closure Compiler 并不总是内联枚举。为什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:46:27 27 4
gpt4 key购买 nike

Google 的 Closure 编译器在决定 enum 是否内联时遵循的规则是什么?

当我通过 Closure Compiler 运行我的代码时JSDoc annotation enum 类型未内联。然而,当我创建一个简化的示例时,enum 类型是内联的,正如这个无意义的示例将演示的那样:

 var my_name_space = (function () {
'use strict';

/** @enum {number} */
var TASK_STATUS = {
REJECT: -1,
UNKNOWN: 0,
APPROVE: 1
};

function init_(a) {
if (a === TASK_STATUS.UNKNOWN) {
alert("Reject");
a = TASK_STATUS.REJECT;
} else if (a === TASK_STATUS.APPROVE) {
alert("Unknown");
a = TASK_STATUS.UNKNOWN;
} else {
alert("Approve");
a = TASK_STATUS.APPROVE;
}
return a;
}
return { init: init_};

}()); // my_name_space


my_name_space.init(-1);

闭包的输出:

 var my_name_space=function(){return{init:function(a){0===a?(alert("Reject"),a=-1):1===a?(alert("Unknown"),a=0):(alert("Approve"),a=1);return a}}}();my_name_space.init(-1);

事实上,无论有无 JSDoc header ,都会发生内衬。

请解释在什么条件下不会发生衬里,或者更好的是,请对上述内容进行修改以证明何时不会发生衬里。

我使用的是“简单”优化级别。

最佳答案

首先,枚举并不是真正用于优化目的的特殊对象,但是,@enum 对于类型检查很有用,并且为此目的有特殊规则。

至于内联,有很多事情会阻止内联,证明所有的可能性是不合理的,但我可以给你一个想法,为什么他们可能不会:

  • 枚举对象被定义为对象的一个​​属性,不能分解为变量(ADVANCED 模式在这里有帮助)
  • 枚举是在全局变量上定义的(ADVANCED 模式在这里有帮助)
  • 枚举对象以别名本身无法删除的方式设置了别名(将枚举对象传递给无法内联的函数,将枚举对象分配给全局值)。
  • 迭代枚举键/值(for-in 等)
  • 枚举对象被覆盖

这些都归结为编译器无法确定它可以:

  • 删除对象并用单独的值替换它
  • 内联这些值

就是说,如果您有一个简单的本地定义,并且您只引用值而不是对象本身,并且值本身是简单的常量(数字、 bool 值),它总是会被内联。

关于javascript - Closure Compiler 并不总是内联枚举。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24723300/

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