例如,我有这段代码:
var objectA = {};
var objectB = {};
objectA.pointer = objectB;
objectB.pointer = objectA;
objectA = null;
objectB = null;
我假设在最后两个语句之后,没有对最初分配给objectA和objectB变量的对象的引用。但根据技术文献,这些对象的参考仍然存在。为什么?即使objectA和objectB设置为null, objectA.pointer 引用还是 objectB.pointer 引用仍然存在?
答案 0 :(得分:5)
即使
objectA.pointer
和objectB.pointer
设置为objectA
,objectB
引用还是null
引用仍然存在?
是
也许有些ASCII艺术有帮助。执行后
var objectA = {};
var objectB = {};
环境包含两个变量(objectA
和objectA
),它们包含对两个对象的引用(表示为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
属性与objectA
和objectB
变量之间没有关系。 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
属性仍保留对其他对象的引用。替换objectA
和objectB
的值并没有改变这一点。
答案 1 :(得分:1)
您不必担心这一点,JS
是一种托管语言,内置Garbage Collector
,可以解决此问题。在此处阅读更多内容:https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
您所描述的内容以各种技术解决。您可以在Java
中阅读此问题How does Java Garbage Collection work with Circular References?,了解其实施情况。