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?
是否
objectA.pointer参考或objectB.pointer引用仍然存在,甚至在objectA和objectB被设置为null?
是.
也许一些ASCII艺术有帮助.演出结束后
var objectA = {};
var objectB = {};
Run Code Online (Sandbox Code Playgroud)
环境包含两个变量(objectA和objectA),它们包含对两个对象的引用(表示为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属性objectA和objectB变量之间没有关系.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性质仍持有其他对象的引用.更换的价值观objectA和objectB没有改变.
| 归档时间: |
|
| 查看次数: |
88 次 |
| 最近记录: |