我根据Douglas Crockford在他的书#34; Javascript: the good parts"中提出的布局创建了一个对象构造函数。
此构造函数在向其添加各种成员和方法后返回that
对象。
其中一种方法是克隆函数,其中JQuery extend
用于深层复制that
对象。
然而,在创建克隆之后,发生了一些奇怪的事情 - 修改克隆的成员似乎不会影响其方法中的that
对象。
您可以在JSFiddle
上看到实时示例代码:
var ctr = function() {
var that = {};
that.a = 0;
that.f = function() {
return that.a;
};
that.clone = function() {
return jQuery.extend(true, {}, that);
}
return that;
}
var obj1 = ctr();
var obj2 = obj1.clone();
obj2.a = 5;
// Why are these values different????
console.log(obj2.a); // prints '5', as expected
console.log(obj2.f()); //prints '0'!!!! WHY??
如果我们在JQuery扩展参数中使用this
而不是that
,它会按预期工作。
这里发生了什么?
答案 0 :(得分:0)
that.f
正在关闭that
的{{1}},当您使用extend时,正在复制该闭包。
o1