说我有
function doWithRetry(retries=5) {
let bigObject = new BigObject()
try {
return doSomething(bigObject)
} catch (e) {
if(retries) {
return doWithRetry(retries-1)
}
}
}
所以我在想,当我再试一次时,调用栈会继续增长,所以我的问题是,函数调用栈中的
bigObject
是否不符合垃圾回收的要求,直到整个栈解散,即使它们没有确实无法访问,因此在执行递归函数调用之前,应该从本地函数作用域中删除bigObject
吗? 最佳答案
JavaScript引擎不够智能,无法检测到是否在递归调用结束之后使用bigObject
,因此我想您必须在递归调用之前将其设置为null
或undefined
有效地无法到达和可收集。如注释中所指出的,另一种解决方案是将其实例化到catch
块中,因为它是用let
声明的