Javascript 为什么不是';是否重新创建此函数

Javascript 为什么不是';是否重新创建此函数,javascript,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];

正如您在下面的示例中所看到的,我正在尝试包装
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);
        };
    }
}
出于某种奇怪的原因,现在存储在另一个对象中的每个属性都只引用迭代的最后一个属性

但是,如果我使用下面这样的外部函数,那么引用就可以了

var contextFn = function(fn, context){
    return function() {
        fn.call(context);
    };
};
...
for (prop in obj) {
    ...
        anotherObj[prop] = contextFn(fn, anotherObj);
    ...
}
为什么会这样?有什么明显的地方我遗漏了吗?

您遗漏的(不太明显的)地方是,在第一个循环中,变量“fn”不是声明它的语句块的局部变量。因此,它由您正在创建的所有函数共享


你的解决方案实际上是正确的。通过使用一个单独的函数,您可以复制用于创建实际包装器函数的值,这样每个包装器都会有自己的“fn”私有副本。

这里有数百个类似的问题,但遗憾的是,在您“得到”之前,它们的相似性并不明显基本的行为是的。。。我确实需要一些Javascript的深入阅读,您有什么建议吗?这是正确的,这就是为什么JSLint建议您“不要在循环中生成函数”。你可以从谷歌搜索这个开始。需要明确的是,它之所以“被所有函数共享”,是因为定义每个新函数时创建的闭包引用了“fn”的实际活动(和变化)值