代码片段 1
js
var obj = {};
obj.x = 1;
obj.y = 2;
function test (obj) {
obj.x = 111;
}
test(obj);
console.log(obj);
// result >>>>>>>>> {x=111,y=2}
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
js
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}
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
js
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指向了对象
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 变量的寻址与传递 - Keystion
- 文章链接:https://webclown.net/posts/Javascript-变量的寻址与传递.html
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。
- 转载请注明来自 Keystion !
markdown
[JavasSript 变量的寻址与传递 - Keystion](https://webclown.net/posts/Javascript-变量的寻址与传递.html)
[JavasSript 变量的寻址与传递 - Keystion](https://webclown.net/posts/Javascript-变量的寻址与传递.html)