1

说我有

function doWithRetry(retries=5) {
  let bigObject = new BigObject()
  try {
    return doSomething(bigObject)
  } catch (e) {
    if(retries) {
      return doWithRetry(retries-1)
    }
  }
}

所以我在想,当我再次尝试时,调用堆栈继续增长,所以我的问题是bigObject我的函数调用堆栈上的 s 是否没有资格进行垃圾收集,直到整个堆栈展开,即使它们不是真的可达,因此我应该bigObject在执行递归函数调用之前从本地函数范围中删除?

4

1 回答 1

1

JavaScript 引擎不够智能,无法检测到bigObject可能在递归调用结束后使用的内容,所以我想您必须将其设置为递归调用nullundefined之前,以使其有效地无法访问和可收集。正如评论中所指出的,另一个解决方案是将它实例化到catch块中,因为它是用声明的let

于 2019-09-13T18:29:59.363 回答