码迷,mamicode.com
首页 > 编程语言 > 详细

探索javascirpt-讨论值传递与引用传递

时间:2015-04-01 10:51:51      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

就大家所知,

  基础数据类型赋值是值传递,(var a = 3, b=a, c=a; 此时令C=2,而b仍然为3)

  而复杂数据类型赋值是引用传递(学过C语言了解指针很清楚,其相当于返回一个地址,通过地址来访问数据,所以一处改变值,各个变量保存此数据的访问都会改变)

 

然而大家请看这段代码

var c = (function() {
	var a = ‘aaaa‘,
		b = ‘bbbb‘;

	function setAB(a, b) {
		this.a = a;
		this.b = b;
	}
	return {
		a: a,
		b: b,
		set: setAB
	}
})();

console.log(c);//Object {a: "aaaa", b: "bbbb", set: function}
c.set(‘1111‘, ‘2222‘);
console.log(c);//Object {a: "1111", b: "2222", set: function}

  当大家扔到控制台的时候会发现,就算a是基本数据类型String,但是对象里的指向并不是值传递,

  更多的是像指向了变量的地址,所以这个a,b都不会被垃圾回收器回收,形成闭包

 

但是,更奇怪的事情就是:(看下列代码)

 

var a = 3, b=‘2‘;

var obj = {
	a: a,
	b: b
}

console.log(obj);//Object {a: 3, b: "2"}

obj.a = 4;

console.log(obj);//Object {a: 4, b: "2"}

console.log(a);//3

好奇怪!。那我再尝试修改基础类型

 

var a = 3, b=‘2‘;

var obj = {
	a: a,
	b: b
}

console.log(obj);//Object {a: 3, b: "2"}

a = 4;

console.log(obj);//Object {a: 3, b: "2"}

console.log(a);//4

  到了此时我就开始迷惑了,希望博友能帮忙

 

探索javascirpt-讨论值传递与引用传递

标签:

原文地址:http://www.cnblogs.com/WJ-yellow/p/4383217.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!