js变量的寻址与传递

 

这是一个朋友问我的问题。他说代码片段一好理解,但疑问在代码片段二 为什么不是输出一个空对象?

代码片段如下两个: 

code segment 1

var obj = {};
obj.x = 1;
obj.y = 2;
function test(obj) {
    obj.x = 111;
}
test(obj);
console.log(obj);

// result >>>>>>>>>  {x=111,y=2}

 code segment 2

var obj = {};
obj.x = 1;
obj.y = 2;
function test(obj) {
    var obj2 = {};
    obj = obj2;
}
test(obj);
console.log(obj);

// result >>>>>>>>>  {x=1,y=2}

 

以下是我的理解

代码片段一就不在讲述,但凡对值类型和引用类型有一定的了解的话,那这个应该是没疑问的。

代码片段二有两个应该注意的地方:

 

1.test方法内变量的寻址

test方法内部可以取到三个变量,新定义了的对象obj2、参数obj、还有方法外的obj。这三个参数有一个特别要注意的地方是,后面两个的名字是一样的,这样在方法运行的时候一定会优先取得参数的那个obj变量。而方法外的那个obj参数实际相当于window.obj。

 

2.变量的传递过程

在调用test方法,并传入方法外的obj变量,实际相当于传入window.obj这样一个引用类型,引用类型的特点是在传递的过程中并不进行自身的值复制,而是传入地址的拷贝,也就是说代码“obj = obj2;”实际是对这个拷贝的地址的改变,因为这个地址只是个拷贝,所以这并不会改变其指向的真实对象。而代码片段1的"obj.x = 111;"这会通过obj这个地址查询到x这个属性,并对其赋值。

 

有点绕,虽然能理解其中的具体含义,但是也没有好的语言来表达,有好资料的朋友欢迎回复来探讨。

 

posted on 2012-09-03 10:03  rulee  阅读(1062)  评论(0编辑  收藏  举报