我正在使用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()
的末尾并不起作用;)
答案 0 :(得分:2)
没有办法手动销毁对象,唯一的方法是释放对象的所有链接并信任删除到GC
实际上在您的代码中,您应该在删除方法中清除this._textDiv = null
和container = null
,因为在某些浏览器中它可能是GC的问题
答案 1 :(得分:1)
没有。您无法直接访问垃圾收集器。正如您所说,您可以做的最好的事情就是确保不再引用该对象。
IMO,这样更好。垃圾收集器比你(和我)聪明得多,因为多年的研究已经开始编写,甚至当你尝试进行优化时,你可能仍然没有比它更好的工作。
当然,如果你正在与JS引擎连接,你将能够控制执行并强制进行垃圾收集(更多),尽管我非常怀疑你是否处于这个位置。如果您有兴趣,可以下载并编译蜘蛛猴(或者v8,或任何引起您喜欢的引擎),在repl中我认为它们都是gc()
。
这让我想到另一点,因为标准没有定义垃圾收集的内部,即使你设法确定在代码中的某个时刻调用gc是有帮助的,它可能不会收获所有平台都有相同的好处。
答案 2 :(得分:1)
this
是一个关键字,您无法为其分配任何值。从作用域中删除对象的唯一方法是手动为每个变量分配null
。
但是,此方法并不总是有效:在XMLHttpRequest的某些实现中,必须重置onreadystate
和open
函数,然后才能从内存中释放XMLHttpRequest对象。