我维护一个JavaScript代码,其中执行一些繁重处理以生成数组的函数将结果保存在函数本身内的缓存变量中。它是这样实现的:
function heavyProcessingStuff(x) {
if(heavyProcessingStuff.cache == undefined)
heavyProcessingStuff.cache = [];
if(heavyProcessingStuff.cache[x] != undefined) {
return heavyProcessingStuff.cache[x]
} else {
return heavyProcessingStuff.cache[x] = x + 1
}
}
奇怪的是,在卸载页面时会执行一个函数,手动删除缓存变量的每个属性,如下所示:
for (n in heavyProcessingStuff.cache) {
delete heavyProcessingStuff.cache[n]
}
我很困惑为什么这是以这种方式实施的。
这是针对一些奇怪的角落情况吗?这样做有什么动机吗?当页面关闭时,浏览器垃圾收集所有内容是不是没有/不应该?
答案 0 :(得分:3)
Javascript使用垃圾收集,最好不要明确释放内存。对此的良好解读是"取消引用误解"在文章"Writing Fast, Memory-Efficient JavaScript"中。
文章引用:
无法在JavaScript中强制进行垃圾回收。您 不想这样做,因为垃圾收集过程是 由运行时控制,一般情况下它通常最清楚 应该清理干净。
答案 1 :(得分:1)
如果没有看到完整的背景,还有另一种可能性:
早期版本的IE(我知道IE6易受影响),使用简单的引用计数系统进行垃圾收集。问题是DOM和JavaScript保持单独的引用堆栈。
这允许开发一种情况,其中DOM(通过expando属性)可以保存到JavaScript引用上 - 并且JavaScript保存在DOM引用上。
此循环引用会在页面之外创建内存泄漏,并且仅在 page 窗口关闭时才释放内存。
通常使用unload事件释放内存并释放任何事件处理程序以避免这种情况。
答案 2 :(得分:-1)
在Chrome和Internet Explorer(或任何实现每个标签流程模型的浏览器)中,你是对的,绝对没有任何价值。实际上,它浪费了CPU时间来尝试和删除,因为通常当关闭选项卡时,进程被终止,释放所有非共享资源。
对于单个进程的浏览器(Firefox仍在进行,虽然正在进行更改),如果引用计数减少到0,这可能会使垃圾收集器更快地完成工作,但它可能也是无意义。除了非常古老的(IE6 for example)浏览器之外,每个现代垃圾收集器都可能会扫除下一遍的所有内容,无论您是否明确删除了引用。