就大家所知,
基础数据类型赋值是值传递,(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
到了此时我就开始迷惑了,希望博友能帮忙
时间: 2024-10-17 18:56:26