日期:2014-05-16  浏览次数:20419 次

以为自己弄懂了传值与传址,结果似乎不是这样的...
看js犀牛书,说是基本类型按照传值,引用类型按照传址,引用类型的传址本质上还是传值,因为这个值是一个引用,也即地址。自以为这很容易理解啊。今天看js高级程序设计,第三版71页的代码,实在不能理解,求高人指导:

<script>
function setName(obj){
    obj.name="Nicholas";
    obj=new Object();
    obj.name="Greg";
}
var person=new Object();
setName(person);
alert(person.name);  //Nicholas
</script>

输出为什么不是“Greg”?麻烦懂得人详细解释一下
------解决方案--------------------
引用:
Quote: 引用:

你弄懂了参数的值传递,就没明白其实“=”赋值符号也是一样的意思么?

setName的第二行干了什么?
第二行让obj引用到内存里的一个新对象的地址,即此时obj里存储的是一个新对象的地址值,然后通过这个引用为新对象添加name属性并赋值为"Greg"。这写不能解决我的疑问啊,只会加深我的疑问。调用函数时,我们将person传入,然后通过person这个引用为它锁引用的对象添加name属性并赋值“Nicholas”,然后又让person指向内存里的新对象,那么此时person已经不再引用以前的那个name属性为“Nicholas”的对象了啊,而是引用name属性为“Greg”的对象了。alert时不就应该输出“Greg”吗?你说是不是,问题出在哪呢?



值传递呀值传递。

person传递给obj,传递的是引用,是person指向的那块内容的地址,说白了现在有两个标识符指向这块内存的首地址,一个是person,一个是obj。

obj = new Object(); 

这一条语句执行之后,obj指向了新的内存地址,那与person这个标识符何干?person这个标识符还是指向原来那片内存呀!obj移情别恋了,person还苦苦恋着它!

画一画内容引用的图就一目了然了!
------解决方案--------------------
楼主没看懂我的比喻么,意思和5楼是一样的,好纠结。。。
看看这个图能明白么

------解决方案--------------------
  function setName(obj) {
            obj.name = "Nicholas";
            alert(obj === person); //true
            obj = new Object();
            alert(obj === person); //false
            obj.name = "Greg";
        }
        var person = new Object();
        setName(person);
        alert(person.name);  //Nicholas
------解决方案--------------------
引用:
Quote: 引用:

你弄懂了参数的值传递,就没明白其实“=”赋值符号也是一样的意思么?

setName的第二行干了什么?
obj只是个形参啊,它不是被实参person替代么,为什么它一直存在?实参传进去以后,形参也该没了啊,形参只是一个名字啊,为什么还会一直存在?



第一个问题上面那哥们有图有真相解释得非常明白了,第二个说实话没看懂你说的什么意思,个人理解所谓形参只是声明了一个函数作用域的变量,与函数中其它局部变量所不同的是这个变量在调用时就使用实参的值进行初始化,当然,还要说句欠揍的话,上面纯粹我瞎猜的未经过实际验证....