正如您在下面的示例中所看到的,我尝试包装obj
中定义的每个函数,以便能够使用anotherObj
作为this
调用它,然后将该包装器作为属性添加到anotherObj
。
注意:isFunction
var isFunction = function(x) {
return typeof(x) == "function";
}
for (prop in obj) {
if (isFunction(obj[prop])) {
var fn = obj[prop];
anotherObj[prop] = function() {
fn.call(anotherObj);
};
}
}
由于某些原因我觉得很奇怪,现在存储在anotherObj
中的每个属性只引用迭代的最后一个属性。
但是,如果我使用如下的外部函数,则引用正常。
var contextFn = function(fn, context){
return function() {
fn.call(context);
};
};
...
for (prop in obj) {
...
anotherObj[prop] = contextFn(fn, anotherObj);
...
}
为什么会这样?我有什么明显的遗失吗?
答案 0 :(得分:2)
你不知道的(不那么)显而易见的事情是,在你的第一个循环中,变量“fn”是不是在它声明的语句块的本地。因此,它是< em>通过所有共享您正在创建的功能。
您的解决方案实际上是正确的。通过使用单独的函数,您将创建用于创建实际包装函数的值的副本,以便每个包装器都拥有它自己的“fn”私有副本。