我看了一篇文章,讲了值传递和引用传递的过程,但是页面最后给出的例子却没有看懂,
function setName(obj){
obj.name = "test1";
obj = {};
obj.name = "test2";
}
var person = new Object();
setName(person);
alert(person.name);
该段代码中方法里进行了 obj={ } ,obj.name = "test2"; 这两步操作,
为什么person.name的值还是test1呢?
就算是引用传递,那这也已经改了指向的地址了啊,为什么还会是test1呢?
求大牛们给解释一下,不胜感激
obj = {}; //已经重新定义覆盖了
对于传参即使按引用传递对象,如果直接在函数中用新值覆盖原先的值,那跟传递进去的对象没关系的。只有改变对象属性,对参数的对象才有影响。
如果学过C,你可以这么理解
内存有一个Person,参数就是执行这个person的指针。如果通过指针.属性,那么肯定也改变了person的属性。但如果对指针重新定义了一个地址,那和原来的person一点关系都没有
此时,内存中有两个object, 一个是原来的person, 而另一个就是在setName中创建的obj, 以我理解,实质上是就两条指针,一条名叫person, 一条叫obj, 你把person的值复制给了obj,然后又创建了一个新的空白object并把它地址给了obj, 所以,现在两条指针指向各自不同的空间。
setName返回,原来的person仍有效, 所以它的name值没错。
你试一下不用 obj = {}
是值引用了。。但是你obj={}指向了另外一个新的对象,释放了对原来person对象的句柄,所以下面的test2更新的已经不是obj对象了,而是{}这个新的对象
javascript中,变量有值访问和引用访问,但参数传递都是值传递(按照professional javascript上的叙述,我比较赞成这种理解)。这在引用类型的变量的传递上特别容易引起困惑。
注意,代码中的形参obj和全局变量person开始都指向同一个对象,但obj={}的执行效果,只是改变了obj变量的指向,而外部的person变量还是指向原来的对象。
解释有很多,但是原理只有一个。javascript是一门很深的语言。学习起来真的狠不容易。