首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么是JavaScript垃圾收集?

什么是JavaScript垃圾收集?
EN

Stack Overflow用户
提问于 2009-05-14 16:58:44
回答 5查看 124.1K关注 0票数 304

什么是JavaScript垃圾收集?对于web程序员来说,为了写出更好的代码,理解JavaScript垃圾回收有什么重要的?

EN

回答 5

Stack Overflow用户

发布于 2009-05-14 17:05:55

当涉及到DOM对象时,要注意循环引用:

Memory leak patterns in JavaScript

请记住,只有当没有对对象的活动引用时,才能回收内存。这是闭包和事件处理程序的常见缺陷,因为一些JS引擎不会检查内部函数中实际引用了哪些变量,而只是保留封闭函数的所有局部变量。

下面是一个简单的例子:

代码语言:javascript
复制
function init() {
    var bigString = new Array(1000).join('xxx');
    var foo = document.getElementById('foo');
    foo.onclick = function() {
        // this might create a closure over `bigString`,
        // even if `bigString` isn't referenced anywhere!
    };
}

只要事件处理程序还在,一个简单的JS实现就不能收集bigString。有几种方法可以解决这个问题,例如在init()的末尾设置bigString = null (delete不适用于局部变量和函数参数:delete从对象中移除属性,并且变量对象是不可访问的-如果您试图删除局部变量,严格模式下的ES5甚至会抛出ReferenceError!)。

如果您关心内存消耗,我建议尽可能避免不必要的闭包。

票数 55
EN

Stack Overflow用户

发布于 2009-05-14 17:06:14

摘自博客中的一句名言

DOM组件和JScript组件一样都是“垃圾收集”的,这意味着如果您在任一组件中创建了一个对象,然后丢失了对该对象的跟踪,它最终将被清除。

例如:

代码语言:javascript
复制
function makeABigObject() {
var bigArray = new Array(20000);
}

调用该函数时,JScript组件将创建一个可在该函数中访问的对象(名为bigArray)。但是,一旦函数返回,您就会“失去对bigArray的跟踪”,因为无法再引用它。那么,JScript组件意识到您已经失去了它的踪迹,因此清理了bigArray --回收了它的内存。同样的事情也适用于DOM组件。如果您说document.createElement('div')或类似的内容,那么DOM组件将为您创建一个对象。一旦您以某种方式丢失了对该对象的跟踪,DOM组件将清理相关的。

票数 17
EN

Stack Overflow用户

发布于 2009-05-14 17:08:16

据我所知,当没有对JavaScript对象的引用时,JavaScript的对象会定期被垃圾回收。这是自动发生的事情,但是如果您想更多地了解它是如何工作的,那么在C++级别上看一下WebKitV8 source code是有意义的

通常你不需要考虑这一点,然而,在更老的浏览器中,比如IE5.5和IE6的早期版本,也许在当前版本中,闭包会创建循环引用,如果不选中它,最终会消耗内存。在我所说的关于闭包的特殊情况下,是在向dom对象添加JavaScript引用,以及向DOM对象添加回引用JavaScript对象的对象时。基本上,它永远不会被收集,最终会导致操作系统在测试应用程序中变得不稳定,从而导致崩溃。实际上,这些泄漏通常很小,但是为了保持代码的整洁,您应该删除对DOM对象的JavaScript引用。

通常,使用delete关键字来立即解除对大型对象的引用是一个好主意,特别是在移动web开发中。这会导致GC的下一次扫描删除该对象并释放其内存。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/864516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档