javascript循环引用——打破循环

标签 javascript circular-reference

例如,我有这段代码:

var objectA = {};
var objectB = {};

objectA.pointer = objectB;
objectB.pointer = objectA;

objectA = null;
objectB = null;

我假设在最后两个语句之后,没有对最初分配给 objectA 和 objectB 变量的对象的引用。但根据技术文献,这些对象的引用仍然存在。为什么 ?即使将 objectA 和 objectB 设置为 null,objectA.pointer 引用或 objectB.pointer 引用是否仍然存在?

最佳答案

Does objectA.pointer reference or objectB.pointer reference still exists even the objectA and objectB are set to null ?

是的。

也许一些 ASCII 艺术有帮助。执行后

var objectA = {};
var objectB = {};

环境包含两个变量(objectAobjectA),它们保存对两个对象的引用(表示为 ref:XXX):

                          +--------------+
+-------+---------+  +--->|  Object#123  |
|objectA|ref:123 *+--+    +--------------+
+-------+---------+                       
|objectB|ref:456 *+--+    +--------------+
+-------+---------+  +--->|  Object#456  |
                          +--------------+

为对象添加属性后,

objectA.pointer = objectB;
objectB.pointer = objectA;

两个对象都有一个 pointer 属性,每个对象都包含对另一个对象的引用:

                         +-----------------+      
                         |   Object#123    |      
                    +--->+-------+---------+<----+
+-------+---------+ |    |pointer|ref:456 *+---+ |
|objectA|ref:123 *+-+    +-------+---------+   | |
+-------+---------+                            | |
|objectB|ref:456 *+-+    +-----------------+   | |
+-------+---------+ |    |   Object#456    |   | |
                    +--->+-------+---------+<--+ |
                         |pointer|ref:123 *+-----+
                         +-------+---------+      

如您所见,pointer 属性与 objectAobjectB 变量之间没有任何关系。 objectA.pointer 没有引用变量 objectB,它得到了它的值的副本 (ref:456),这是对对象。

将两个变量都设置为null后,

objectA = null;
objectB = null;

环境是这样的:

                         +-----------------+      
                         |   Object#123    |      
                         +-------+---------+<----+
+-------+---------+      |pointer|ref:456 *+---+ |
|objectA|  null   |      +-------+---------+   | |
+-------+---------+                            | |
|objectB|  null   |      +-----------------+   | |
+-------+---------+      |   Object#456    |   | |
                         +-------+---------+<--+ |
                         |pointer|ref:123 *+-----+
                         +-------+---------+      

pointer 属性仍然持有对其他对象的引用。替换 objectAobjectB 的值并没有改变这一点。

关于javascript循环引用——打破循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41351763/

相关文章:

javascript - 函数无法正确读取状态值

C++智能指针循环链接

c# - 克隆一个包含许多对象并列出的对象 C#

c# - 处理Json时如何修复循环引用错误

c# - 如何处理循环引用 - 或者 - 中断在公开 Entity Framework 数据模型的 WCF 服务中返回的第一级子级下的引用?

javascript - 如何将 Prop 传递给组件的故事?

javascript - jQuery 仅水平或垂直选择单元格

javascript - IndexedDB 的包装函数

.net - 交叉引用程序集

javascript - React-Native native-base 如何减小卡片项之间的间距?