为了账号安全,请及时绑定邮箱和手机立即绑定

js高程中第71页中的例子(关于传递参数的引用类型值的传递),两个小问题理解不来

js高程中第71页中的例子(关于传递参数的引用类型值的传递),两个小问题理解不来

繁华开满天机 2019-02-13 17:15:20
举一个例子:function setName(obj) {obj.name = "Nicholas";}var person = new Object();setName(person);alert(person.name); //"Nicholas"FunctionArgumentsExample02.htm以上代码中创建一个对象,并将其保存在了变量 person 中。然后,这个变量被传递到 setName()函数中之后就被复制给了 obj 。在这个函数内部, obj 和 person 引用的是同一个对象。**换句话说,即使这个变量是按值传递的, obj 也会按引用来访问同一个对象。---问题1:这里说的按值传递,这个值是指什么?**于是,当在函数内部为 obj 添加 name属性后,函数外部的 person 也将有所反映;因为 person 指向的对象在堆内存中只有一个,而且是全局对象。有很多开发人员错误地认为:在局部作用域中修改的对象会在全局作用域中反映出来,就说明参数是按引用传递的。为了证明对象是按值传递的,我们再看一看下面这个经过修改的例子:这个例子与前一个例子的唯一区别,就是在 setName() 函数中添加了两行代码:一行代码为 obj重新定义了一个对象,另一行代码为该对象定义了一个带有不同值的 name 属性。**在把 person 传递给setName() 后,其 name 属性被设置为 "Nicholas" 。---问题二:属性被修改后能在函数外部读取到,不就是引用类型嘛?后面的解释理解不了**然后,又将一个新对象赋给变量 obj ,同时将其 name属性设置为 "Greg" 。如果 person 是按引用传递的,那么 person 就会自动被修改为指向其 name 属性值为 "Greg" 的新对象。但是,当接下来再访问 person.name 时,显示的值仍然是 "Nicholas" 。这说明即使在函数内部修改了参数的值,但原始的引用仍然保持未变。实际上,当在函数内部重写 obj 时,这个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁。
查看完整描述

2 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

的确这里不太像是一般理解中的按值传递。

其实这里高程的例子已经讲的不错了,引用类型传入时候会创建一个新的同样的对象并且赋值给形参。

类似于创建了一个新的地址,指针指向了实参地址,于是这个时候修改形参变量能够同步修改到实参,但是如果重新赋值形参,则是修改了其指针指向,不再指向实参地址。


查看完整回答
反对 回复 2019-02-26
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

怕我说不清,找了个链接深入理解参数按值传递
简单的总结:

参数如果是基本类型是按值传递,如果是引用类型按共享传递。

但是因为拷贝副本也是一种值的拷贝,所以在高程中也直接认为是按值传递了


查看完整回答
反对 回复 2019-02-26
  • 2 回答
  • 0 关注
  • 443 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信