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