都说闭包内部存的是引用而不是复制,那么且看
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) {t = val;};
})();
}
}
var prop = {Name : "Jim", Age : 13};
var con = new Container(prop);
console.log(con.getName());
con.setName("Lucy");
console.log(con.getName());
console.log(prop.Name);
输出却是
Jim
Lucy
Jim
也就是Containner的setName方法没有改变prop属性了,这不是复制吗?OK,我们看正常一点的
function Foo(list){
var a = list;
return function(){
a.push(1);
console.log(a);
}
};
var l = [];
var f = Foo(l);
f();
f();
l.push(2);
f();
这里的输出却是
[1]
[1, 1]
[1, 1]
[1, 1, 2, 1]
这又是明显的保存的引用的行为,也就是闭包的push结果, 外部的list可以看到,而外部的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) {t = val;};
})();
}
}
var prop = {Name : "Jim", Age : 13};
var con = new Container(prop);
console.log(con.getName());
con.setName("Lucy");
console.log(con.getName());
console.log(prop.Name);
输出却是
Jim
Lucy
Jim
也就是Containner的setName方法没有改变prop属性了,这不是复制吗?OK,我们看正常一点的
function Foo(list){
var a = list;
return function(){
a.push(1);
console.log(a);
}
};
var l = [];
var f = Foo(l);
f();
f();
l.push(2);
f();
这里的输出却是
[1]
[1, 1]
[1, 1]
[1, 1, 2, 1]
这又是明显的保存的引用的行为,也就是闭包的push结果, 外部的list可以看到,而外部的list更改,闭包也能反映出来,这是什么情况