作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
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 对于类型检查很有用,并且为此目的有特殊规则。
至于内联,有很多事情会阻止内联,证明所有的可能性是不合理的,但我可以给你一个想法,为什么他们可能不会:
这些都归结为编译器无法确定它可以:
就是说,如果您有一个简单的本地定义,并且您只引用值而不是对象本身,并且值本身是简单的常量(数字、 bool 值),它总是会被内联。
关于javascript - Closure Compiler 并不总是内联枚举。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24723300/
我是一名优秀的程序员,十分优秀!