javascript值传递疑惑
PHP中文网
PHP中文网 2017-04-10 14:28:46
[JavaScript讨论组]

以前一直以为,给函数传递了对象,那么在函数体内对对象属性的更改,必然可以在全局反映出来。

比如:

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解释,还是不懂啊!

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(6)
巴扎黑

参数 o 是 o1 所引用的对象的引用
o = {} 是 改变了 o 的引用, o1 和它引用的对象都不受影响

ringa_lee
代码 解释
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
怪我咯

参数传递分值传递引用传递, 你代码中的是引用传递. 引用传递类似于指针.

第一段代码没问题是因为你没有改变o指向的对象(即没改变引用值);
第二段代码setName中将o指向的对象改成{}(即o不再指向o1), 在这之后的所有操作都与o1无关. 当然,在这之前的操作还是对o1有效.

PHP中文网

楼上的解释很清晰。

其实这种直接修改参数的方式应该避免,很容易bug的。应该通过函数返回结果。

怪我咯

这个和python差不多,o=o1 o.name='xiaoha' o={}#改变引用 o.name='22222'

天蓬老师

JS中都是参数传递都是传值的,只不过是在涉及到对象时,传的是地址信息
当一个对象标识符被重新赋值时,其对应的地址就会发生变化,对应到不同的地址空间上
而原始标识符对应的地址没有被修改,所以就这样了~~~~

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号