【问题标题】:Scope of parameter passed to async function传递给异步函数的参数范围
【发布时间】:2022-01-07 18:00:25
【问题描述】:
{
const data = new Uint8Array([0x01]);
await input_writer.write(data);
}
在上面的示例中,“数据”被传递给异步操作,然后立即作用域。底层内存会发生什么?在异步功能完成之前它是否保持活动状态?
【问题讨论】:
标签:
javascript
arrays
asynchronous
memory
scope
【解决方案1】:
一开始我以为data只是代码块末尾的垃圾回收器,但似乎JavaScript引擎比我想象的要聪明。
确实,在执行这个sn-p时:
class Test {}
(async function() {
const data = new Test;
await write(data);
console.log('never');
function write(data) {
return new Promise(() => {});
}
})();
然后使用“内存”选项卡拍摄内存快照,搜索时没有出现Test。
但是,如果您尝试此 sn-p 并拍摄新快照,则实例会显示,因为 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 将不再被使用甚至在代码块结束之前,这有助于尽快清除内存。