如何从对象中显式释放JavaScript对象?

时间:2011-09-15 20:35:10

标签: javascript object garbage-collection

我正在使用John Resig's recipe用于JavaScript'类'和继承。我已经将我的代码剥离回这样的问题:

MyClass = Class.extend({

    // create an <h3>Hello world!</h3> in the HTML document
    init : function (divId) { 
        this._divId = divId;
        this._textDiv = document.createElement("h3");
        this._textDiv.innerHTML = "Hello world!";
        document.getElementById(divId).appendChild(this._textDiv);
    },

    // remove the <h3> and delete this object
    remove : function () {
        var container = document.getElementById(this._divId);
        container.parentNode.removeChild(container);

        // can I put some code here to release this object?
    }

});

一切运作良好:

var widget = new MyClass("theDivId");
...
widget.remove();

我将在页面上拥有数百个这样的东西(显然具有一些合理的功能),我想要一种简单的方法来释放每个对象的内存。我知道我可以使用widget = null;并信任GC在需要时释放对象(?),但是我可以在remove()方法中做一些明确的事情吗?我知道将this = null;放在remove()的末尾并不起作用;)

3 个答案:

答案 0 :(得分:2)

没有办法手动销毁对象,唯一的方法是释放对象的所有链接并信任删除到GC 实际上在您的代码中,您应该在删除方法中清除this._textDiv = nullcontainer = null,因为在某些浏览器中它可能是GC的问题

答案 1 :(得分:1)

没有。您无法直接访问垃圾收集器。正如您所说,您可以做的最好的事情就是确保不再引用该对象。

IMO,这样更好。垃圾收集器比你(和我)聪明得多,因为多年的研究已经开始编写,甚至当你尝试进行优化时,你可能仍然没有比它更好的工作。

当然,如果你正在与JS引擎连接,你将能够控制执行并强制进行垃圾收集(更多),尽管我非常怀疑你是否处于这个位置。如果您有兴趣,可以下载并编译蜘蛛猴(或者v8,或任何引起您喜欢的引擎),在repl中我认为它们都是gc()

这让我想到另一点,因为标准没有定义垃圾收集的内部,即使你设法确定在代码中的某个时刻调用gc是有帮助的,它可能不会收获所有平台都有相同的好处。

答案 2 :(得分:1)

this是一个关键字,您无法为其分配任何值。从作用域中删除对象的唯一方法是手动为每个变量分配null

但是,此方法并不总是有效:在XMLHttpRequest的某些实现中,必须重置onreadystateopen函数,然后才能从内存中释放XMLHttpRequest对象。