正如您在下面的示例中看到的,我试图包装 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);
...
}
为什么会这样?有什么明显的我想念的吗?
最佳答案
您遗漏的(不那么)明显的事情是,在您的第一个循环中,变量“fn”不是声明它的语句 block 的局部变量。因此,它是 < em>由您正在创建的所有函数共享。
您的解决方案实际上是正确的。通过使用单独的函数,您正在制作用于创建实际包装器函数的值的副本,以便每个包装器都将拥有自己的“fn”私有(private)副本。
关于javascript - 为什么不重新创建此功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23415677/