以前一直以为,给函数传递了对象,那么在函数体内对对象属性的更改,必然可以在全局反映出来。
比如:
var setName=function(o){
o.name='xiaoha';
};
var o1={};
setName(o1);
console.log(o1.name);//'xiaoha'
这没错啊,运行结果跟自己想的一模一样的。
可是看了高程3后,发现想错了。
如下:
var setName=function(o){
o.name='xiaoha';
o={};
o.name='22222';
};
var o1={};
setName(o1);
console.log(o1.name);//'xiaoha'
这个怎么解释,才能让人心服口服啊!高程3解释,还是不懂啊!
ringa_lee2017-04-10 14:30:46
代码 | 解释 |
---|---|
var o1 = {}; |
创建空对象obj1,赋给变量o1 o1(obj1) |
setName(o1); |
o1(obj1)作为参数丢给setName |
function setName(o) { |
第一个参数叫o,所以这里就是o(obj1) |
o.name = 'xiaoha' |
o(obj1).name = 'xiaoha' |
o={} |
这里创建了第二个对象obj2,赋给o此时o成为那个新对象的引用o(obj2) |
o.name='222' |
o(obj2).name = '222' |
} |
退出函数作用域,释放o,这时obj2已经没有任何引用,所以被回收 |
console.log(o1.name) |
o1(obj1).name 自然是 xiaoha |
怪我咯2017-04-10 14:30:46
参数传递分值传递
和引用传递
, 你代码中的是引用传递
. 引用传递类似于指针.
第一段代码没问题是因为你没有改变o
指向的对象(即没改变引用值);
第二段代码setName
中将o
指向的对象改成{}
(即o
不再指向o1
), 在这之后的所有操作都与o1
无关. 当然,在这之前的操作还是对o1
有效.
天蓬老师2017-04-10 14:30:46
JS中都是参数传递都是传值的,只不过是在涉及到对象时,传的是地址信息
当一个对象标识符被重新赋值时,其对应的地址就会发生变化,对应到不同的地址空间上
而原始标识符对应的地址没有被修改,所以就这样了~~~~