javascript循环引用 - 打破循环

Dus*_*ani 1 javascript circular-reference

例如,我有这个代码:

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

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

objectA = null;
objectB = null;
Run Code Online (Sandbox Code Playgroud)

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

Fel*_*ing 5

是否objectA.pointer参考或objectB.pointer引用仍然存在,甚至在objectAobjectB被设置为null

是.

也许一些ASCII艺术有帮助.演出结束后

var objectA = {};
var objectB = {};
Run Code Online (Sandbox Code Playgroud)

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

                          +--------------+
+-------+---------+  +--->|  Object#123  |
|objectA|ref:123 *+--+    +--------------+
+-------+---------+                       
|objectB|ref:456 *+--+    +--------------+
+-------+---------+  +--->|  Object#456  |
                          +--------------+
Run Code Online (Sandbox Code Playgroud)

在向objets添加属性后,

objectA.pointer = objectB;
objectB.pointer = objectA;
Run Code Online (Sandbox Code Playgroud)

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

                         +-----------------+      
                         |   Object#123    |      
                    +--->+-------+---------+<----+
+-------+---------+ |    |pointer|ref:456 *+---+ |
|objectA|ref:123 *+-+    +-------+---------+   | |
+-------+---------+                            | |
|objectB|ref:456 *+-+    +-----------------+   | |
+-------+---------+ |    |   Object#456    |   | |
                    +--->+-------+---------+<--+ |
                         |pointer|ref:123 *+-----+
                         +-------+---------+      
Run Code Online (Sandbox Code Playgroud)

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

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

objectA = null;
objectB = null;
Run Code Online (Sandbox Code Playgroud)

环境看起来像这样:

                         +-----------------+      
                         |   Object#123    |      
                         +-------+---------+<----+
+-------+---------+      |pointer|ref:456 *+---+ |
|objectA|  null   |      +-------+---------+   | |
+-------+---------+                            | |
|objectB|  null   |      +-----------------+   | |
+-------+---------+      |   Object#456    |   | |
                         +-------+---------+<--+ |
                         |pointer|ref:123 *+-----+
                         +-------+---------+      
Run Code Online (Sandbox Code Playgroud)

pointer性质仍持有其他对象的引用.更换的价值观objectAobjectB没有改变.