如何理解JavaScript函数中的传递参数?
做前端开发有一段时间,对一些相关概念有了一定的认识。但是,秉着“勿在浮沙筑高台”的态度,我又返回来看了看《JavaScript高级程序设计》这本书。
在看到“变量、作用域和内存问题”这一章时,书中说到:因为访问变量有按值和按引用两种方式,而参数只能按值传递。
示例:
function setName(obj){
obj.name = "Nicholas";
obj = new Object();
obj.name = "Grag";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
其实这个示例,我觉得已经说明了参数的传递的确是按值来传递的,哪怕是一个对象。
但我还是不太明白其中的原理,想象不出在内存中是怎样的。
还望,前端高手能够帮忙解读,解读。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
obj
开始只是person
的一个副本,正如其他引用类型的复制一样,它和person
指向的是同一地址,但obj = new Object();
之后,obj
指向了另一块内存,与person
断开了联系,这就是重写。如果没有obj = new Object();
这一句,alert(person.name);
的结果将会是Grag
@hiYoHoo 的图已经很简明了,我再来介绍一下 obj 和 person 的本质区别,以下描述比较粗浅,而且比较冗长,见谅,如有遗漏之处请指正。
在 JavaScript 中,从内存分配角度来看,有两种类型的变量:
在栈空间分配的变量(所有值为 number、boolean、string、null、undefined、Symbol 的变量)
在堆空间分配的变量(所有值为数组、对象、函数的变量)
谨记以上两种类型,下面称他们为栈变量和堆变量
那么什么是堆、什么是栈?
从前一座城市,每个出生的人都能分配到一间占地面积固定的房(占用空间已知),每间房子都有它的值(里面居住的人已知)和它的地址(街道门牌号已知),如果一个住户从来不搬家,那么街道办就非常好管理所有的定居居民,办事效率会非常高。
从前又有一个游牧民族,这个游牧民族会因为人口、资源、环境等原因迁徙,他们没有固定面积的住房,也不知道他们随时会迁徙到哪里,既然连地址都不知道,更别提想要知道他们里面有哪些人了。这就给城邦的街道办带来了管理麻烦,虽然游牧民族很灵活,他们的生存活动范围可以随意扩大,但是他们经常迁徙,地址经常变动,所以街道办采用的管理策略是:每次游牧民族一迁徙,就给街道办寄一封信,信里面只写着游牧民族首领家的地址,街道办就带人先找到首领家,然后再由首领带领,依次找到所有人的家。
来看你的代码:
只是传了person对象的值进去(也就是所指向的堆),而不是person对象本身,所以里面new的obj修改不了原来的person对象的指向。