BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / www-technology / #39106同步于 2016/11/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖

[问题]js高程中的参数按值传递

qqpp3939
2016/11/9镜像同步8 回复
1)调用setName时person的地址赋给了obj,在setName中新建一个对象,obj的地址就和person的地址不同了,所以后面的obj.name="Greg"就不对person起作用? 2)假设参数传递的时候是按引用传递,那么person应该传什么给obj,才能使alert输出Greg?
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
hesha机器人#1 · 2016/11/9
person实际上是一个指针,指向了堆内存里的一个对象,把这个指针传给obj后,obj也指向了这个对象(相当于有两个指针指向了这个对象),obj.name = "Nicholas"后,这个对象的name属性变成了Nicholas,然后obj = new Obejct()相当于obj指向了另一个对象,并且把另一个对象的name赋值为greg,但是person还是指向的原来那个对象,所以person.name是Nicholas。
hesha机器人#2 · 2016/11/9
另外,这个函数返回后,obj第二次指向的那个对象就不存在了。因为obj是局部变量,函数返回局部变量就销毁了,而obj指向的那个对象的引用次数变为了0,然后那个对象就被内存回收了。 在js里,所有的参数传递都是值传递,没有地址传递。所以调用setName(person),相当于把person赋值给了obj,像这样 obj = person。再次强调(敲黑板),person是一个指针!!
qqpp3939机器人#3 · 2016/11/9
【 在 hesha 的大作中提到: 】 : 另外,这个函数返回后,obj第二次指向的那个对象就不存在了。因为obj是局部变量,函数返回局部变量就销毁了,而obj指向的那个对象的引用次数变为了0,然后那个对象就被内存回收了。 : 在js里,所有的参数传递都是值传递,没有地址传递。所以调用setName(person),相当于把person赋值给了obj,像这样 obj = person。再次强调(敲黑板),person是一个指针!! js高程中说,假设参数传递是引用传递,那么alert输出Greg,那么person应该要传什么给obj才能是引用传递啊
hesha机器人#4 · 2016/11/9
再一次强调,在js里,参数传递都是值传递,没有地址传递,没有引用传递。。都是值传递(敲黑板)。js高程第3版第70页(第四章4.1.3传递参数)第一句话:ECMAScript中所有函数的参数都是按值传递。所以,无论如何都是按值传递的,没有引用传递。。。
youngsc机器人#5 · 2016/11/9
js中应该没有纯粹的按引用传递,参数obj这个东西是和person指向了同一个对象的引用,所以你无法在函数中更改person指向的位置。
mima031103机器人#6 · 2016/11/12
obj作为参数,传递虽然是值传递,但是传入的是的指针!把obj的地址作为值,进行值传递。 指针既然指向的是person那么之后的修改都是直接修改person对象。 在setName函数中,new object的时候事实上是新创建了一个object对象,指针obj又转而指向新对象,所以修改只是修改了新的obj,最后退出函数被清除。
h452114240机器人#7 · 2016/11/13
[ema3]赞一个 【 在 hesha 的大作中提到: 】 : person实际上是一个指针,指向了堆内存里的一个对象,把这个指针传给obj后,obj也指向了这个对象(相当于有两个指针指向了这个对象),obj.name = "Nicholas"后,这个对象的name属性变成了Nicholas,然后obj = new Obejct()相当于obj指向了另一个对象,并且把另一个对象的name赋值为greg,但是person还是指向的原来那个对象,所以person.name是Nicholas。
slm1990机器人#8 · 2016/11/14
抛开你问这个问题,js中还是存在共享传递的。这个问传递针对的是传参是对象。 通过『我邮2.0』发布