在关闭选项卡/窗口之前删除变量是否有助于释放内存?
Does deleting variables before closing the tab/window help releasing memory?
我正在维护一个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]
}
我很困惑为什么这样实现。
这是针对某个奇怪的极端情况吗?有这样做的动机吗?当页面关闭时,浏览器不应该收集所有内容吗?
Javascript使用垃圾收集,最好不要显式地释放内存。在"编写快速,内存高效的JavaScript"一文中的"去引用误解"中有很好的阅读。
引自文章:
JavaScript中不可能强制垃圾收集。你不希望这样做,因为垃圾收集过程是由运行时控制,它通常最清楚什么时候发生事情
如果没有看到完整的上下文,还有另一种可能性:
早期版本的IE(我知道IE6很容易受影响),使用一个简单的引用计数系统进行垃圾收集。问题是DOM和JavaScript保持了单独的引用栈。
这允许这样一种情况的发展:DOM(通过一个expando属性)可以保存一个JavaScript引用——而JavaScript保存一个DOM引用。
这个循环引用会造成内存泄漏,内存泄漏存在于页之外,并且只有在page窗口关闭时才会释放内存。
通常使用unload事件来释放内存并释放任何事件处理程序以避免这种情况。
在Chrome和Internet Explorer(或任何实现每个选项卡进程模型的浏览器)中,你是对的,绝对没有价值。事实上,尝试删除是在浪费CPU时间,因为通常当一个选项卡关闭时,一个进程就会被杀死,从而释放所有非共享资源。
对于单个进程的浏览器(Firefox仍然是,尽管正在进行改进),如果引用计数减少到0,这可能会使垃圾收集器更快地完成工作,但这可能也是毫无意义的。除了非常老的浏览器(例如IE6),每个现代垃圾收集器都可能在下一轮清除所有内容,无论您是否显式删除引用。
- 是否可以用变量确认提示警报
- 用真或假初始化变量是否在 Javascript 中建立了内容的方向
- 如何确定套接字中的变量是否匹配
- 如何在JavaScript中检查变量是否为null和/或未定义
- 检查变量是否为字符串的简单方法
- 是否可以在另一个变量中使用未声明的变量
- 它是否创建了许多不利于JavaScript性能的变量
- jade/pug是否可以在include语句中使用变量
- 如何测试变量是否只有字母而不是abc1.关于验证电子邮件
- 如何查看变量名称是否已在Javascript中定义
- 检查是否已设置GET变量
- 在函数参数中使用变量,无论是否使用Jquery
- Chrome扩展:是否有一种方法可以运行JavaScript来获取页面上的内部html,并将其保存到扩展中的变量中
- JavaScript:检查变量是否等于两个或多个值之一的简单方法
- 是否可以在reactjs中设置多个状态变量
- 为什么不允许值为0的变量询问是否存在
- Javascript 测试是否设置了变量
- 是否可以在 Javascript 中将未声明的变量作为参数传递
- 变量/对象是否按值传递,为什么我不能在 javascript 中使用变量更改对象的属性
- 测试JavaScript是否符合异常变量名