我一直在阅读有关javascript垃圾收集的许多SO问题,但这只是让我感到困惑。看看我的例子
var valueObject= (function(){
function valueObject(){
this.Text = 'hello';
}
return valueObject;
})();
var referenceObject = (function(){
function referenceObject (refObject){
this.Reference = refObject;
}
return referenceObject ;
})();
var globalClass = (function(){
function globalClass(){
}
globalClass.prototype.load() {
this.A = new valueObject();
this.B = new referenceObject(this.A);
}
globalClass.prototype.destroy() {
this.A = null;
this.B = null;
}
return globalClass;
})();
var Test = new globalClass();
Test.load();
Test.destroy();
现在一旦调用了Test对象destroy,是否会将valueObject和referenceObject标记为collection?因为this.A = null
将删除对valueObject的引用,但它仍然在this.B
内有引用。但是,如果调用了this.B = null
,则会删除对this.B
的引用,但B
对象仍会出现在A
的引用中?
不确定这是否有意义,这对我来说有点混乱。感谢。
答案 0 :(得分:3)
首先,通常只使用以大写字母开头的名称作为构造函数,大多数情况下代码都具有向后的约定。
现在一旦调用了Test对象destroy,是否会将valueObject和referenceObject标记为collection?
Dunno关于“标记”,但可用,是的。
因为this.A = null将删除对valueObject的引用
是
但它内部仍有引用.B
不,它没有。
查看代码(和修复错误):
globalClass.prototype.load = function () {
this.A = new valueObject();
this.B = new referenceObject(this.A);
}
首先, load 方法添加一个 A 属性,其中包含对 valueObject 的调用返回的值,这只是一个普通的对象
然后添加 B 属性,该属性引用具有 Reference 属性的另一个对象,该属性引用与 A 相同的对象。
但是如果调用this.B = null,则删除对this.B的引用,但是B对象仍然会在那里引用A?
是的,但由于现在没有对 B 以前引用的对象的引用,并且它是唯一引用以前由 A 引用的对象的对象,它们是两者都可用于垃圾收集。