{
const data = new Uint8Array([0x01]);
await input_writer.write(data);
}
在上面的示例中,“資料”被傳遞給異步操作,然后立即作用域。底層記憶體會發生什么?在異步功能完成之前它是否保持活動狀態?
uj5u.com熱心網友回復:
起初我認為這data只是代碼塊末尾的垃圾回收,但似乎 JavaScript 引擎比我想象的要聰明。
實際上,在執行此代碼段時:
class Test {}
(async function() {
const data = new Test;
await write(data);
console.log('never');
function write(data) {
return new Promise(() => {});
}
})();
然后使用“記憶體”選項卡拍攝記憶體快照,Test搜索時沒有顯示。
但是,如果您嘗試此代碼段并拍攝新快照,則該實體會顯示,因為此write傳遞data的實作會在一段時間setTimeout內保持參考:data
class Test {}
(async function() {
const data = new Test;
await write(data);
console.log('in a long time');
function write(data) {
return new Promise(resolve => setTimeout(() => resolve(data), 999999999));
}
})();
注意:您必須將其粘貼到控制臺中才能在記憶體快照中看到它。
作為一個結論,如果write沒有副作用來保存對 的參考data,那么 JavaScript 引擎(至少是鉻)似乎足夠聰明,可以確定data即使在代碼塊結束之前也不會再使用它,這有助于清除盡快記憶。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/410861.html
標籤:
