Javascript 在关闭选项卡/窗口之前删除变量是否有助于释放内存?

Javascript 在关闭选项卡/窗口之前删除变量是否有助于释放内存?,javascript,performance,optimization,memoization,Javascript,Performance,Optimization,Memoization,我正在维护一个JavaScript代码,其中一个函数执行一些繁重的处理来生成数组,并将结果保存在函数本身内部的缓存变量中。它是这样实现的: function heavyProcessingStuff(x) { if(heavyProcessingStuff.cache == undefined) heavyProcessingStuff.cache = []; if(heavyProcessingStuff.cache[x] != undefined) {

我正在维护一个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]
}
奇怪的是,页面卸载时会执行一个函数,手动删除缓存变量的每个属性,如下所示:

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]
}
我不明白为什么会这样实施

这是专门针对某个奇怪的角落案例的吗?有没有这样做的动机?当页面关闭时,浏览器是否应该垃圾收集所有内容

Javascript使用垃圾收集,最好不要显式释放内存。这篇文章中的“去引用错误概念”是一篇很好的阅读材料

文章引述:

在JavaScript中强制垃圾收集是不可能的。你 我不想这样做,因为垃圾收集过程是 由运行时控制,它通常最清楚事情发生的时间 应该清理一下


在Chrome和internetexplorer(或任何浏览器,实现每个选项卡模型的流程)中,您是对的,绝对没有价值。事实上,尝试和删除是在浪费CPU时间,因为当一个选项卡关闭时,进程通常会被终止,从而释放所有非共享资源


对于单一进程的浏览器(Firefox仍然是,尽管正在进行更改),如果引用计数减少到0,这可能会使垃圾收集器更快地工作,但这可能也是毫无意义的。除了非常旧的()浏览器之外,每个现代垃圾回收器可能会在下一个过程中清除所有内容,而不管您是否显式删除引用。

在没有看到完整上下文的情况下,还有一种可能性:

IE的早期版本(我知道IE6是易受影响的)使用了一个简单的引用计数系统进行垃圾收集。问题是DOM和JavaScript保持了独立的引用堆栈

这允许出现这样一种情况:DOM(通过expando属性)可以保存JavaScript引用,而JavaScript保存在DOM引用上


此循环引用将创建一个内存泄漏,该泄漏存在于页面之外,并且只有在页面窗口关闭时才释放内存


通常使用卸载事件释放内存并释放任何事件处理程序来避免这种情况。

我想你是对的。浏览器可以处理这一切。我只能假设它是C语言和旧代码的回溯,而这些代码放进去并没有什么坏处。也许当时有些浏览器出现内存泄漏,这是一个解决办法。有些浏览器在你离开时会将页面保留在内存中,这样当你回到历史时,它们可以更快地返回页面。最终,他们当然会删除此缓存。刷新页面时也会调用卸载事件,可能他们在刷新时缓存未清除时遇到问题,因此他们必须手动处理缓存的清除。@PimpTrizkit我正要给你投票,直到我读到,“…这对放入没有影响。”事实上,这确实会造成伤害,如果有大量的
重处理任务,可能会造成很大的伤害,因为当浏览器试图关闭选项卡时,它可能会挂起浏览器。哦,是的,你的权利!但除此之外,我一直在猜测。请注意:只要对象保持在同一个窗口中,这是真的。如果您有在不同窗口(弹出窗口、iFrame)之间通信并在它们之间传递对象的代码,那么这可能不再是真的。我知道这是一个特例,但却是一个真实的例子:。这不是一项琐碎的任务,尤其是当每个窗口都有自己的进程时。您能否证实,“对于单个进程的浏览器……这可以使垃圾收集器更快地工作”?我相信您的答案是正确的,而且很重要。我建议你提供更多的细节,也许引用你的文章,否则你可能会被忽略。谢谢你的建议!添加了文章中最适用的引语,以便在删除链接后仍然有效。不过,这篇文章中的引语让我很感兴趣。“如果您在本地使用数据缓存,请确保清理该缓存或使用老化机制,以避免存储不太可能重用的大块数据。”。这不正是我的情况吗?不管怎样,谢谢你的回答,很棒的文章。当页面被卸载时,将没有对数据的引用,所以垃圾收集器将在下一次传递时收集它。垃圾收集器会不断优化以获得最佳性能,通常,当我们试图自己收集东西时,最多只会增加代码复杂性,最坏的情况下会增加新的bug并降低性能。“这种循环引用会造成内存泄漏,并一直存在于页面之外,只有在页面关闭时才会释放内存。”你是说“当窗户关上的时候”吗?不客气。我记得那个bug,但我认为这只是来自一些老派程序员(或旧代码),他们错误地认为从对象中删除属性会释放内存。不过,谢谢你的记忆之旅!猜得好。不幸的是,IE是我们开发的主要浏览器。不过,我不知道这段代码是否支持IE6。如果我发现了,我会在这里发表评论。谢谢你的回答。