javascript - Javascript 引用计数中的循环引用

标签 javascript

在 Nicholas Zakas 的书中,他解释了在 Javascript 中使用引用计数进行垃圾回收时的循环引用问题。他使用以下示例:

function problem(){
    var objectA = new Object();
    var objectB = new Object();

    objectA.someOtherObject = objectB;
    objectB.anotherObject = objectA;
}

解释这两个对象永远不会释放分配给它们的内存,因为它们在函数内部有两个对它们的引用。我想澄清一下这是如何工作的。

显然,每个对象都有两个引用。第一个对象同时有 objectAobjectB.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). 

}

但是当函数退出时会发生什么?据我了解, objectAobjectB 以及它们各自相互引用的属性都将被销毁,因此,这两个对象的引用计数将减少 2 .我没有看到Zakas所说的“循环引用问题”。有人可以解释一下他想表达的意思吗?

最佳答案

As far as I understand, both objectA and objectB and their respective properties that reference each other will be destroyed.

没有。 局部变量 objectAobjectB 将被销毁(因为函数范围结束并且没有闭包引用这些变量)。这意味着每个变量引用的对象中的引用计数都会减少 1

如果对象的引用计数为 0,则该对象将被销毁,并且它引用的所有其他事物的计数都会减少。但是每个对象的计数仍然是 1 - 它们仍然相互引用 - 并且没有任何东西被破坏。

关于javascript - Javascript 引用计数中的循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46281652/

相关文章:

javascript - 为什么 NodeJS 中的这个导出函数不能按我想要的方式工作?

javascript - 检测窗口调整大小事件何时完成

javascript - 有人认识这种公钥吗?

javascript - 单击它调整循环云图像的大小

asp.net - 哪些 .NET 控件不使用 javascript 来处理事件?

javascript - YouTube 视频 : fit content on non 16:9 father (as background-size: cover)

javascript - BHO Internet Explorer 插件 - 脚本注入(inject)问题

javascript - 如何将下拉值绑定(bind)到javascript数组?

javascript - 模式弹出窗口中的取消按钮不起作用

javascript - 一起使用 getElementById 和 getElementsByTagName