请问一下老师,关于视频中的循环引用案例

来源:5-3 选择练习

Carol246

2019-07-04 18:19:48

请问一下老师,视频中的循环引用案例,第一个 xm=null; 减少的是哪个 {} 的引用次数?为什么此时不是两个 {} 的引用次数都减一?这样在第二个 xh=null; 时再都减一,两个 {} 的引用http://img.mukewang.com/climg/5d1dd2bc000107af03060254.jpg次数就都为 0 了?

写回答

3回答

好帮手慕星星

2019-07-05

你好,对象是引用类型,变量在栈内存中,值在堆内存中,看下面图可能好理解一些:

http://img.mukewang.com/climg/5d1ee25500010b6107760416.jpg

xm和xn局部变量解除引用只是xm和xn不再指向堆内存中的值,但是在堆内存中还是在相互引用的。

自己再理解下。

0
harol246
h 谢谢老师,我再想一下
h019-07-09
共1条回复

好帮手慕星星

2019-07-05

你好,在练习中最后b=null,b本身没有引用,是b的arr属性进行引用了,所以将b置空之后,减少的次数是属性arr的引用。

而在视频中,xm以及xm中的wife属性都有引用,xm被置空之后,减少的只是xm的引用,属性wife的引用并没有减少。

自己再理解下,祝学习愉快!

0
harol246
h 老师,我还是有一些不明白呃……xm和xm的wife属性引用的是不同对象啊?xm引用的是第一个{},其wife属性引用的是第二个{},为什么两者没有同时解除引用呢?
h019-07-05
共1条回复

好帮手慕星星

2019-07-04

你好,同学理解的可能有些问题,可以参考下面的解释:

xm和xn是fn函数中的局部变量,所以fn调用之后,xm和xn就解除了引用,也就是xm=null,和xn=null。

但是xm和xn对象中的wife和husband属性也引用了xh和xm,所以调用fn之后只解除了一次引用,并不能完全解除引用,这就是相互引用出现的问题。

自己再理解下,祝学习愉快!

0
harol246
h 但在 5-3 选择题中,var a=[4], b={}; b.arr=a; 当 b=null; 时,减少了一次 b 的 arr 属性所引用 [4] 的引用次数。 在视频案例中,xm=null 时,如果说解除的是 xm 对 {} 的引用。 那为什么没有解除 xm 的 wife 属性引用的 xh 呢?
h019-07-04
共1条回复

0 学习 · 14456 问题

查看课程