为什么互相引用不会销毁?

为什么互相引用不会销毁?

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

这里函数执行结束后就被销毁,为什么xm和xh的值变为null,而不是直接消失呢?就是我觉得应该是变为和声明它们之前一样的状态才对啊,就比如这里没有声明也没有用到的变量a一样的状态。

而且函数销毁了,xm和xh的值变为null,它们的那个属性不应该也清空吗?变为null或者变为我上面说的那种消失状态,怎么还存在互相引用呢?

正在回答

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

4回答

同学你好,解答如下:

视频和练习是不一样的。课程讲解的是循环引用.以前浏览器用的引用计数,引用计数有个问题,就是循环引用计数无法全部清除,这个是浏览器自身机引用计数制造成的。(这个机制现在不用了,所以稍微了解一下即可)

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

本题中没有使用循环引用,所以不会有这个现象。如果一个对象的被清除了,这个引用地址就没有了,它们的属性肯定是随着对象的清空也就没有了。

同学可以再理解一下,如果实在理解不了的话,可以先把这个知识放一放,等到后面同学接触的多了有一定的知识体系的时候再回过头来研究一下,会更好理解。

祝学习愉快~

好帮手慕码 2020-03-15 19:05:12

同学你好,解答如下:

(1)函数执行完,函数不会被销毁。变量==null表示:它所引用的内容为空,并不是全部消失。如回复一中第二条中,xh被xm.wife又引用一次,所以还存在引用关系。

(2)“b.arr=a的引用跟着消失了”这句话并不准确,由于b={}指向了另一个{},所以这时候引用关系不存在了,引用次数会-1。可以参考下图去理解:

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

同学可以再思考一下,祝学习愉快~

  • 提问者 Aurora_Meteor #1
    b被清空了意思是b没有内容了?它的属性和方法这些东西都没有了,所以b.arr就没有再引用[4]了是吗?那xm和xh在函数执行完以后变为null,它们不也是被清空了吗?它们的属性和方法也应该没有了呀,它们的属性的引用关系也应该没有了才对啊...
    2020-03-15 19:14:02
好帮手慕码 2020-03-15 10:11:11

同学你好,解答如下:

(1)xh和xm是局部变量,在执行完fn()之后,这两个变量的引用会被销毁,会变成null,空的。可以理解为是规定;

(2)存在引用是因为在函数中,还存在引用关系,所以没有办法一次性全部销毁:

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

(3)请问同学是不理解选择题的答案吗?可以再看下解析,讲的很清楚,如果还是不理解可以详细说一下不理解哪一步,以便有针对性的为同学解答。

祝学习愉快~

  • 提问者 Aurora_Meteor #1
    1、针对您的第二点,那意思是函数执行完以后,里面的变量被销毁了,但是这个函数没有被销毁还是存在的?所以变量是变成null而不是完全消失?因此他们之间的属性引用关系也就依旧存在吗? 2、针对您的第三点,我是觉得那个选择题和这里我提出的问题是一样的情况。我觉得这两个问题里,变量都是销毁了变为null,既然那个选择题里b.arr=a的引用跟着消失了,那我提出的问题里面那两个变量及其属性之间的引用关系怎么就还存在没有消失呢?
    2020-03-15 12:15:15
提问者 Aurora_Meteor 2020-03-14 20:48:56

比如后面的第二个选择题,答案解析如下:

下面是数组[4]被引用的过程以及被引用次数的变化:

var a = [4]; // 1次

var b = a; // 2次

b = {}; // b的指向变了,所以是1次

b.arr = a; // 又被指向了1次,所以是2次

 b = null; //b被清空了,所以最后是1次。

这里b=null被清空了,所以b.arr就没有再引用了,引用次数减一

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

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

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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