Javascript 结束语:为什么';对象不能内联吗?
我一直对闭包编译器有一个问题——有时它会内联结构的内容,有时则不会。例如:Javascript 结束语:为什么';对象不能内联吗?,javascript,google-closure-compiler,Javascript,Google Closure Compiler,我一直对闭包编译器有一个问题——有时它会内联结构的内容,有时则不会。例如: (function(){ const C = {SOMETHING: 0x76, BLA: 123} function Test(write) { write(5+C.BLA); } exports.hello = function() { return Test; }; })() 不内联: (function(){function a(b){b(5+c.BLA)}var c={
(function(){
const C = {SOMETHING: 0x76, BLA: 123}
function Test(write) {
write(5+C.BLA);
}
exports.hello = function() {
return Test;
};
})()
不内联:
(function(){function a(b){b(5+c.BLA)}var c={SOMETHING:118,BLA:123};exports.hello=function(){return a}})();
但只需更改导出Test
的方式即可:
(function(){
const C = {SOMETHING: 0x76, BLA: 123}
function Test(write) {
write(5+C.BLA);
}
exports.hello = Test;
})()
将导致其处于罚款状态:
(function(){exports.hello=function(a){a(128)}})();
我在这里使用的是简单的优化,但是高级的优化并不能改善问题,类型注释也不能:
(function(){
/** @enum {number} */
const C = {/** @const */SOMETHING: 0x76, /** @const */BLA: 123}
function Test(write) {
write(5+C.BLA);
}
exports.hello = function() {
return Test;
};
})()
知道为什么它不会内联吗?有没有办法从编译器那里得到报告或发现
谢谢 本地属性内联非常保守。如果在使用该值之前确定该值是已定义的,那么它将仅内联。但是,由于函数的提升,函数定义在对象文本之前排序,因此函数在定义对象之前引用对象(即使之前不能调用它,过程也不会跟踪它) 将函数定义更改为:
函数测试(){…}
到
const Test=function(){…}
允许编译器内联它。这将您的代码示例减少到:
(function() {
var b = function(a) {
a(128);
};
exports.hello = function() {
return b;
};
})();
您可以在此处看到结果:
本地属性内联非常保守。如果在使用该值之前确定该值是已定义的,那么它将仅内联。但是,由于函数的提升,函数定义在对象文本之前排序,因此函数在定义对象之前引用对象(即使之前不能调用它,过程也不会跟踪它) 将函数定义更改为:
函数测试(){…}
到
const Test=function(){…}
允许编译器内联它。这将您的代码示例减少到:
(function() {
var b = function(a) {
a(128);
};
exports.hello = function() {
return b;
};
})();
您可以在此处看到结果: