问题描述
闭包编译器一直存在问题-有时它将内联结构的内容,有时则不会。例如:
(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)}})();
我在这里使用SIMPLE_OPTIMISATIONS,但ADVANCED_OPTIMISATIONS并没有改善问题,也没有键入注释:
(function(){
/** @enum {number} */
const C = {/** @const */SOMETHING: 0x76,/** @const */BLA: 123}
function Test(write) {
write(5+C.BLA);
}
exports.hello = function() {
return Test;
};
})()
有人知道为什么它不会内联吗?有没有一种方法可以获取报告或从编译器中查找?
谢谢!
解决方法
本地属性内联非常保守。只有在确定值是在使用之前定义的时候,它才会内联。然而,由于函数提升函数定义在对象字面量之前排序,因此函数在定义之前引用对象(即使它之前不能被调用,传递也不会跟踪它)。
更改函数定义:
function Test() {...}
到
const Test = function() {...}
允许编译器内联它。这将您的代码示例减少到:
(function() {
var b = function(a) {
a(128);
};
exports.hello = function() {
return b;
};
})();
你可以在这里看到结果: