循环引用和这题有什么区别呢?

循环引用和这题有什么区别呢?

# 具体遇到的问题
老师讲的和这题有什么不一样吗?为什么结果不一致

正在回答

登陆购买课程后可参与讨论,去登陆

4回答

同学你好,理解的有些误差,。具体可以参考如下解析:

1、b={}表示b引用了一个空对象,b.arr =a 表示在这个空对象上添加了一个属性,名为arr,引用了变量a。 所以此时[4]的引用次数增加一次。

2、将b=null置为空之后,b之前引用的对象就不再被引用了,会被垃圾回收机制回收,这个对象都被回收了,那么这个对象上的arr属性也就不再会引用a了,所以[4]的应用次数就会减少一次。

3、本题代码与视频中的区别就是,b = null 之后,b之前引用的对象不再被引用,会被垃圾回收机制回收,视频中xm = null 之后,清除了xm的引用,但是xm之前引用的对象,被xh.husband属性继续引用,不会被垃圾回收机制回收,所以这个对象的引用继续存在。

祝学习愉快~

好帮手慕慕子 2020-10-30 10:42:28

同学你好,因为练习题中b本身并没有被其它变量引用,所以最后设置b=null将b置空之后,减少的次数是属性arr对a的引用。

而在视频中,xm指向了{}地址,xh指向了{}地址,xh指向的这个地址中有一个属性指向了xm这个{}地址,当设置xm=null,清除的是xm指向的{}地址。但是之前xh指向的那个地址中husband属性还指向了xm之前指向的{}地址,而xm之前指向的地址中有一个wife属性指向了xh指向的{}地址,所以xm.wife还有一次引用没有解除。

祝学习愉快~

  • 提问者 慕粉4184331 #1
    老师做个假设 b={} b. arr=a 现在b=null,此时b. arr还是指向a。如果b一开始没有引用{}那么b.arr就会被清除 ,老师是这个意思吗?
    2020-10-30 10:52:24
好帮手慕夭夭 2020-10-29 18:28:20

同学你好,参考如下理解:

本题代码解析:代码中,只有b和b的属性引用过a,但是a没有引用过b,所以没有形成循环引用。

http://img1.sycdn.imooc.com//climg/5f9a94a2093ebe9806500253.jpg

它与课程中的区别在于,课程中是两个对象各自的属性相互引用了对方。xm的属性wife引用了xh,xh的属性husband引用了xm。此时将xm和xh分别置为null,以前一个xm对象为例,它的引用计数将减1。若要满足垃圾回收的条件,需要清除xh中的属性(husband)对它的引用,而要清除掉这个引用的前提条件是xh引用的对象被回收,可是该对象的引用计数也为1,因为xm.wife指向了它......相互引用也就进入一种死循环的状态,无法清零。

http://img1.sycdn.imooc.com//climg/5f9a95be0990957807240319.jpg


祝学习愉快~

  • 提问者 慕粉4184331 #1
    题中b=null,b.arr也被置为了null,为什么此处xm=null,xm.wife还在指向内存呢?
    2020-10-29 19:00:56
提问者 慕粉4184331 2020-10-29 17:52:35

为什么循环引用置为null后就不能直接清除呢?而这题就可以呢?

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师