这一题我建议各位先去自己用浏览器试一试,发现结果不符合你所想再回来看下面的内容。
同样还是先放源码:
跟之前一样在关键部分标了序号,那么开始吧。
先别看setObj的函数体部分,等到它第一次被调用的时候再回头去看。我们从var p=..这里开始看。
var p={name:"xixi",age:24} 这段声明了一个全局变量p引着一个对象,姑且称这个对象为A。然后我们把p扔给setObj函数:setObj(p); 好,开始执行这个函数:
因为p当中存放的是对象A的地址,所以①所进行的是将函数外面的p所存放的地址赋给函数的局部变量:o,此时o中也放着A的地址。也就是说我们接下来如果对o进行操作,就相当于对A进行操作。至此程序里有两个变量:在window下的p以及在setObject函数的活动对象内的局部变量o。
②赋一个空对象给o。此时o不再指向A,转而指向一个空对象,姑且称这个对象为B。
③给上面刚新建的空对象B新建一个属性name,并赋值为小红。
最后console.log(p);至此请思考一下,p从最开始到现在,有放开过它一开始指向的那个对象么? 是没有的。p从头到尾一直引着对象A。而在对象A身上只发生过一件事:①那里让它的name的值起变化。如果还没明白为什么 p 一直引着A 请再看看蓝色字部分。
所以输出结果是 :
=========================================================================================================
第二部份的代码只是少了上面的②③两步而已,就略过了。
————以上内容皆有本人原创,欢迎在评论区一起讨论、对文章进行纠错。如需转载请邮箱联系博主征得同意,并注明转载出处 博主邮箱:[email protected]