如何解决闭包:为什么没有内联对象?
闭包编译器一直存在问题-有时它将内联结构的内容,有时则不会。例如:
(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;
};
})();
你可以在这里看到结果:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。