【问题标题】:Scope of parameter passed to async function传递给异步函数的参数范围
【发布时间】:2022-01-07 18:00:25
【问题描述】:
{
  const data = new Uint8Array([0x01]);
  await input_writer.write(data);
}

在上面的示例中,“数据”被传递给异步操作,然后立即作用域。底层内存会发生什么?在异步功能完成之前它是否保持活动状态?

【问题讨论】:

  • GC 只会收集无法访问/未使用的数据。
  • 可能有帮助 - stackoverflow.com/a/54322111/743464 - 可能是特定于实现的。它可能会一直存在,直到没有任何引用它并且 javascript 阻塞垃圾收集传递运行。

标签: 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 将不再被使用甚至在代码块结束之前,这有助于尽快清除内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    相关资源
    最近更新 更多