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

JavaScript的一点疑问

OriSoul
2014/7/28镜像同步13 回复
小白看了 JavaScript高级程序设计 第三章,有点疑问啊 书上说,ECMAScript所有函数的参数都是按值传递的。其中举了一个例子: function setName(obj) { obj.name = "Nicholas"; obj = new Object(); obj.name = "Greg"; } var person = new Object(); setName(person); alert(person.name); //"Nicholas" 作者说如果 person 是按引用传递的,那么 person就会自动被修改为指向其 name 属性值为 Greg 的新对象。 所以不是按引用传递。 那如果对于变量赋值: var obj1 = new Object(); var obj2 = obj1; obj2.name = "Nicholas"; obj2 = new Object(); obj2.name = "Greg"; alert(obj1.name); 最后显示也是"Nicholas",而并不是"Greg"。 那作者说“访问变量,是按引用”是什么意思? 这两个例子,不论传递参数还是变量赋值,都是针对的地址值。表现都是一样的。那作者又为什么强调引用呢?反而让人难理解 望大神指点啊
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
weiyitheonly机器人#1 · 2014/7/28
专业的说法怎么说我不知道,不过我说说我的理解: function setName(obj) { obj.name = "Nicholas"; obj = new Object(); obj.name = "Greg"; } var person = new Object(); setName(person); alert(person.name); //"Nicholas" 这里面,在调用setName的时候,传的obj的值,而不是引用。 我先说明一下我用来帮助理解的这两个概念: obj的值,就是指向那个object的指针(js的概念里面未必叫指针)。 obj的引用,指的是obj的别名,也就是说,它的引用变成了什么,它也变成了什么。 调用这个函数的时候,有三条语句。 第一条,给obj的name赋值。不管是按什么传递的,obj指向的object就是person指向的object。所以person的name也改变了。 第二条,obj赋新值。如果是按引用传递,这一步的话,obj做什么改变,person也该做什么改变。但是如果是按值传递的话,obj被赋了新的值,也就是说obj不再指向原来的person指向的object了。以后obj再做什么,person都不会再变化。 第三条,就是改obj的name的值。这条执行完后,如果person的name变了,所以是按引用传递,如果没变,说明是按值传递。 var obj1 = new Object(); var obj2 = obj1; obj2.name = "Nicholas"; obj2 = new Object(); obj2.name = "Greg"; alert(obj1.name); 至于这部分的访问变量,是按引用,应该说的是访问object的时候,是按object的引用来访问的(不是按object的引用的引用来访问的)。 这两个地方都提到了引用。函数里面提到的那个引用,有点类似于别名。而变量的这个引用,类似于指针。 不知道理解你的问题没有,也不知道说清楚没有。。。 没get到你问题的point。。。
liu907030机器人#2 · 2014/7/28
“访问变量,是按引用”这句话在第三章哪?没太看懂你最后要问的问题
OriSoul机器人#3 · 2014/7/28
70页倒数第9行,是第四章,不好意思。其实想问的就是针对引用类型的变量复制和传递参数,是不是都是针对地址值?可能表述不清,这章看得不明白 【 在 liu907030 (bf) 的大作中提到: 】 : “访问变量,是按引用”这句话在第三章哪?没太看懂你最后要问的问题 通过『我邮2.0』发布
bebop机器人#4 · 2014/7/28
还是感觉C里的指针概念很重要,虽然像java,javascript都用引用的概念替换了指针的概念,但是把指针弄懂,这里也就不难明白。
lp1900机器人#5 · 2014/7/28
js是C系语言 用指针去理解就不难解释了
douglas26机器人#6 · 2014/7/28
function setName(obj) { obj.name = "Nicholas"; //执行这句的时候person和obj指向同一个地址A,该地址内的数据为Nicholas obj = new Object(); //分配新的空间,将新的空间的地址B赋值给obj。(person还是指向A) obj.name = "Greg"; //将B地址内的数据改为Greg } 最后要求返回的是A地址内的数据,所以是nicholas 【 在 OriSoul 的大作中提到: 】 : 小白看了 JavaScript高级程序设计 第三章,有点疑问啊 : 书上说,ECMAScript所有函数的参数都是按值传递的。其中举了一个例子: : [code=js] : ...................
liu907030机器人#7 · 2014/7/28
js中,代表引用类型的变量,比如var obj1 = new Object()中的obj1,存放的值是一个指针,指向存储对象的内存处,所以用var obj2 = obj1后,两个变量都保存的是这个指针了,这时你对其中一个做操作,其实是两个变量指向的同一处内存中存放的对象做的操作,反应到变量上就是另一个变量也随之变化了,这就是引用的意思。如果这时你obj2 = new Object(),obj2中存放的就是一个新的指针了,你再对obj2所做的操作就不会反映到obj1上了。 【 在 OriSoul 的大作中提到: 】 70页倒数第9行,是第四章,不好意思。其实想问的就是针...
OriSoul机器人#8 · 2014/7/28
那作者举了一个例子,来说明是函数参数值传递,而不是引用传递。你看我写的第二段代码,不也能证明变量赋值也不是引用吗 【 在 liu907030 (bf) 的大作中提到: 】 : js中,代表引用类型的变量,比如var obj1 = new Object()中的obj1,存放的值是一个指针,指向存储对象的内存处,所以用var obj2 = obj1后,两个变量都保存的是这个指针了,这时你对其中一个做操作,其实是两个变量指向的同一处内存中存放的对象做的操作,反应到变量上就是另一个变量也随之变化了,这就是引用的意思。如果这时你obj2 = new Object(),obj2中存放的就是一个新的指针了,你再对obj2所做的操作就不会反映到obj1上了。 : 70页倒数第9行,是第四章,不好意思。其实想问的就是针... 通过『我邮2.0』发布
liu907030机器人#9 · 2014/7/28
是能体现啊,但是作者想要阐述的是JavaScript函数参数传值的特点,你的例子没涉及函数啊 【 在 OriSoul 的大作中提到: 】 小白看了 JavaScript高级程序设计 第三章,...