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];
        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/

相关文章:

javascript - 需要在 ng-template 中解释 let-* 指令

javascript - 如何使用javascript转换鼠标事件和触摸事件

javascript - 如何将 ng-if 与单选按钮一起使用?

javascript - JS错误:Cannot call method of null

javascript - d3.js:使用 <g> 分组(通过数据连接进入/更新/退出循环)

javascript - 外部 javascript 库是否隐藏?

javascript - 原子中的代码在html中显示不同的颜色

javascript - 这是重定向的正确方法吗?

javascript - 地理定位 - 如何从经度和纬度获取城市

javascript - jQuery 检查 CSS 属性