gpt4 book ai didi

javascript - 为什么不重新创建此功能

转载 作者:行者123 更新时间:2023-11-30 17:29:36 24 4
gpt4 key购买 nike

正如您在下面的示例中看到的,我试图包装 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com