例如,我有这段代码:
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 orobjectB.pointer
reference still exists even theobjectA
andobjectB
are set tonull
?
是的。
也许一些 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
的值并没有改变这一点。
关于javascript循环引用——打破循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41351763/