gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:40:13 24 4
gpt4 key购买 nike

我一直在阅读许多关于 javascript 垃圾回收的问题,但这让我有点困惑。看看我的例子

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 object destroy,valueObject 和 referenceObject 是否会被标记为收集?因为 this.A = null 会移除对 valueObject 的引用,但它在 this.B 中仍然有引用。但是如果 this.B = null 被调用,对 this.B 的引用被删除,但是 B 对象仍然存在引用 A?

不确定这是否有意义,这让我有点困惑。谢谢。

最佳答案

首先,惯例是仅对构造函数使用以大写字母开头的名称,您的代码大部分情况下都落后于该惯例。

Now once the Test object destroy has been called, will the valueObject and referenceObject be marked for collection?

不知道“标记”,但可用,是的。

Because this.A = null will remove the reference to the valueObject

but it still has a reference inside this.B

不,不是。

查看代码(并修复错误):

globalClass.prototype.load = function () {
this.A = new valueObject();
this.B = new referenceObject(this.A);
}

首先,load 方法添加了一个 A 属性,其值由调用 valueObject 返回,这只是一个普通的对象。

然后它添加一个 B 属性,该属性引用另一个对象,该属性具有引用与 A 相同的对象的 Reference 属性。

But if this.B = null is called, the reference to this.B is removed, but the B object will still be there with a reference to A?

是的,但是因为现在没有对以前被 B 引用的对象的引用,而且它是唯一引用以前被 A 引用的对象的对象,所以它们是两者都可用于垃圾收集。

关于内部引用对象上的 Javascript 垃圾收集器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24748422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com