在 Nicholas Zakas 的书中,他解释了在 Javascript 中使用引用计数进行垃圾回收时的循环引用问题。他使用以下示例:
function problem(){
var objectA = new Object();
var objectB = new Object();
objectA.someOtherObject = objectB;
objectB.anotherObject = objectA;
}
解释这两个对象永远不会释放分配给它们的内存,因为它们在函数内部有两个对它们的引用。我想澄清一下这是如何工作的。
显然,每个对象都有两个引用。第一个对象同时有 objectA
和 objectB.anotherObject
指向它。第二个对象的情况类似。所以每个对象的引用计数都是2。但是当函数退出时会发生什么?这在书中并没有真正描述。他说,只要对值的引用被另一个值覆盖,引用计数就会减少。我认为这意味着:
function problem(){
var objectA = new Object();
var objectB = new Object();
objectA.someOtherObject = objectB;
objectB.anotherObject = objectA;
objectA.someOtherObject = objectA; //<-- that if I were to do this,
//the reference count of the second object (B)
//would become 1, and 3 for the first object (A).
}
但是当函数退出时会发生什么?据我了解, objectA
和 objectB
以及它们各自相互引用的属性都将被销毁,因此,这两个对象的引用计数将减少 2 .我没有看到Zakas所说的“循环引用问题”。有人可以解释一下他想表达的意思吗?
最佳答案
As far as I understand, both objectA and objectB and their respective properties that reference each other will be destroyed.
没有。 局部变量 objectA
和 objectB
将被销毁(因为函数范围结束并且没有闭包引用这些变量)。这意味着每个变量引用的对象中的引用计数都会减少 1。
如果对象的引用计数为 0,则该对象将被销毁,并且它引用的所有其他事物的计数都会减少。但是每个对象的计数仍然是 1
- 它们仍然相互引用 - 并且没有任何东西被破坏。
关于javascript - Javascript 引用计数中的循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46281652/