[英]Closure: why doesn't an object get inlined?
我一直遇到閉包編譯器的問題 - 有時它會內聯結構的內容,有時不會。 例如:
(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;
};
})();
你可以在這里看到結果:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.