说我有

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


所以我在想,当我再试一次时,调用栈会继续增长,所以我的问题是,函数调用栈中的bigObject是否不符合垃圾回收的要求,直到整个栈解散,即使它们没有确实无法访问,因此在执行递归函数调用之前,应该从本地函数作用域中删除bigObject吗?

最佳答案

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

09-12 00:48