javascript - 在事件触发时将变量传递给闭包

标签 javascript functional-programming closures

我有一个循环,我在其中为一个事件定义了一个闭包:

for (var i = 0; i < 3; i++) {
    obj.onload = function(e) {
        me.myFunction(e, i);
    };
}

我需要将该计数器变量传递给触发 load 事件时调用的函数。我总是传递相同的值。

如何将正确的计数器值传递给函数?

最佳答案

解决此问题的通常方法是使用构建器函数,以便处理程序关闭不会更改的内容:

function buildHandler(index) {
    return function(e) {
        me.myFunction(e, index);
    };
}
for (var i = 0; i < 3; i++) {
    obj.onload = buildHandler(i);
}

可以使用立即调用的函数表达式 (IIFE) 来做到这一点,但在理论上它会在每个循环中创建和丢弃一个函数(我希望大多数 JavaScript现在的引擎对此进行了优化),至少我认为它更难阅读:

for (var i = 0; i < 3; i++) {
    obj.onload = (function(index) {
        return function(e) {
            me.myFunction(e, index);
        };
    })(i);
}

有一个 ES5 特性,Function#bind,如果你想直接使用 me.myFunction,你可以使用它,但是你必须改变顺序您期待的参数(首先是 index然后是 事件):

for (var i = 0; i < 3; i++) {
    obj.onload = me.myFunction.bind(me, i);
}

bind 创建一个函数,该函数在被调用时调用原始函数,并将 this 设置为第一个参数(因此,上面的 me) ,然后是您给它的任何其他参数,然后是调用该函数时使用的任何参数。 (这就是为什么 myFunction 期望它们必须更改为 index, e 而不是 e, i 的原因。)

在旧版浏览器上,您需要为 Function#bind 填充一个 shim。

关于javascript - 在事件触发时将变量传递给闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19433596/

相关文章:

javascript - 为许多对象提供 id - 这是个坏主意吗?

javascript - 对重复的 HTML 使用相同的 JavaScript

javascript - AngularJS 更新服务变量不起作用

text - 在 clojure 中读取文件并忽略第一行?

javascript - 有人可以解释一下 howtonode 中的函数包装习惯吗?

javascript - 如何让 io.sockets.on 调用外部/全局函数?

javascript - 填充 <span> 不起作用

arrays - Swit中的函数式编程分配数组元素以纠正 "buckets"

haskell - 什么是单子(monad)?

rust - 为什么通过移动捕获Arc会使我的关闭 FnOnce 而不是 Fn