JavasSript 变量的寻址与传递

代码片段 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}

代码片段 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}

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

<!–more–>

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

1 test方法内变量的寻址

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

2 变量的传递过程

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

other

var num = 1;

function outFn() {
    this.num = 10;
    function inFn() {
        console.log(num);
        var num = 100;
        console.log(this.num);
        console.log(window.num);
    }
    return inFn;
}

var newfn = outFn();
new newfn();  // this指向了对象

注:
引用类型:引用类型的特点是在传递的过程中并不进行自身的值复制,而是传入地址的拷贝。

转自:http://www.cnblogs.com/rulee/archive/2012/09/03/2663800.html

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注