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