为什么不重新创建此功能

时间:2014-05-01 20:05:19

标签: javascript

正如您在下面的示例中所看到的,我尝试包装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);
    ...
}

为什么会这样?我有什么明显的遗失吗?

1 个答案:

答案 0 :(得分:2)

你不知道的(不那么)显而易见的事情是,在你的第一个循环中,变量“fn”是不是在它声明的语句块的本地。因此,它是< em>通过所有共享您正在创建的功能。

您的解决方案实际上是正确的。通过使用单独的函数,您将创建用于创建实际包装函数的值的副本,以便每个包装器都拥有它自己的“fn”私有副本。