JavasSript 变量的寻址与传递

代码片段 1

1
2
3
4
5
6
7
8
9
10
11
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

1
2
3
4
5
6
7
8
9
10
11
12
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这个属性,并对其赋值。

other

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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


JavasSript 变量的寻址与传递
https://webclown.net/2016/05/29/Javascript-变量的寻址与传递/
作者
Key
发布于
2016年5月29日
许可协议