内部引用对象上的Javascript垃圾收集器

时间:2014-07-15 01:01:10

标签: javascript garbage-collection

我一直在阅读有关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的引用中?

不确定这是否有意义,这对我来说有点混乱。感谢。

1 个答案:

答案 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 引用的对象的对象,它们是两者都可用于垃圾收集。