如何在JavaScript对象内显式释放对象?

3

我正在使用John Resig的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()方法中是否可以做一些明确的事情?我知道在remove()的末尾放置this = null;是不起作用的 ;)

3个回答

2

没有办法手动销毁对象,唯一的方法是释放所有与您的对象相关的链接,并将其删除交给GC处理。 实际上,在您的代码中,您还应该在remove方法中清除this._textDiv = nullcontainer = null,因为这可能会成为某些浏览器中GC的问题。


通常情况下,删除JS对象是没有意义的,但当您不再需要DOM引用时,将其设置为null是一个好主意(对于IE6来说更是必须的)。 - c69
好的,我已经添加了几行代码将我的DOM引用设置为null。谢谢你的提示 :) - wpearse

1

不行。你没有任何直接访问垃圾回收器的方法。正如你所说,你能做的最好的事情就是确保对象不再被引用。

在我看来,这样做更好。垃圾回收器比你(和我)聪明得多,因为多年的研究已经投入到编写它,即使你尝试进行优化,你仍然不可能比它做得更好。

当然,如果你正在与JS引擎进行交互,你将能够控制执行并强制进行垃圾回收(以及更多),尽管我非常怀疑你处于这种位置。如果你感兴趣,可以下载并编译spider monkey(或v8,或任何你喜欢的引擎),在repl中,我认为两者都是gc()

这就带我到另一个问题,由于标准没有定义垃圾回收的内部机制,即使你设法确定在代码的某个点调用gc有益,也很可能在所有平台上都无法获得相同的好处。


1

this 是一个关键字,你不能给它赋任何值。从作用域中删除对象的唯一方法是手动将 null 分配给每个变量。

然而,这种方法并不总是有效:在某些 XMLHttpRequest 的实现中,必须重置 onreadystateopen 函数,才能释放 XMLHttpRequest 对象所占用的内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接