1
anjianshi 2013-07-13 10:50:06 +08:00
|
2
hardway 2013-07-13 10:57:12 +08:00
你第一个例子测试的都是基本值,如果这样就对了,因为var t = properties[i];对于基本类型会复制
var prop = {Name : "Jim", Age : 13, Cards: []}; var con = new Container(prop); con.getCards().push(1); console.log(con.getCards()); console.log(prop.Cards); |
4
2code 2013-07-13 11:32:45 +08:00
|
5
pythonee OP |
6
finian 2013-07-13 12:23:58 +08:00
@pythonee properties的Name和Age是基本值,于是,var t = properties[i]; 是复制行为,list是对象,var a = list; 是引用行为。第一个例子,按照你的逻辑,应该是酱紫的:
function Container( properties ) { var objthis = this; for ( var i in properties ) { (function(){ var t = properties[i]; objthis[ "get" + i ] = function() {return t;}; objthis[ "set" + i ] = function(val) {properties[i] = val;}; })(); } } |
7
anjianshi 2013-07-13 17:33:02 +08:00
@pythonee
不好意思,你在5楼说的那句话我理解不能 -_- || 其实这个问题和闭包无关,"闭包内部存的是引用" 这句话本身就是个伪命题,可能是楼主把哪个人说的话理解错了吧。 闭包就是一个类似屏障的东西,闭包里能访问外部的变量,但外部没法直接访问闭包里的变量,它不牵扯到“引用”的问题。 以前看过一个文章对这个问题讲得很生动,但现在找不到了。我把大意说一下吧: 想象 javascript 中的每一个对象就是一个人(包括字符串,数组,object),变量名就是它的名字 a = {"id" : 1} 就是给 {"id" : 1} 起了个名字,叫 "a" b = a 就是给 {"id" : 1} 起了个外号,叫 "b" 现在无论你调用 a 还是 b ,得到的都是 {"id" : 1} 这个人 a.foo = 'bar' alert(b.foo) // 输出 'bar' 那么,如果我们这样操作:b = {"id" : 2} 这代表什么呢? 这个操作同时带来两个效果: 1. 取消了 {"id" : 1} 的外号,现在他只有 "a" 这个一个名字了,"b" 这个外号给了别人 2. 给 {"id" : 2} 起了一个名字,也就是 "b" 现在你在调用 a 进行操作,就不会再对 b 有什么影响了 |
9
heroicYang 2013-07-14 14:42:43 +08:00
|
10
heroicYang 2013-07-14 14:54:53 +08:00
你的第一段代码问题并不出在闭包身上,而是如4楼的 @2code 所说那样。
|
11
FrankFang128 2014-01-22 19:26:13 +08:00
不缩进的代码读不懂,估计楼主已经知道原因了。
复制引用类型不是代价大,是有坑。尤其是循环引用。 |