javascript - 在循环中绑定(bind)事件处理程序需要关闭吗?

标签 javascript jquery closures bind

我正在尝试在循环中绑定(bind)事件处理程序,例如:

        var tabs = ['one', 'two', 'three', 'four']

        for(var i = 0; i < tabs.length; i++) {
            alert(tabs[i]);
            var id = i;
            $('#' + tabs[i]).bind('click', function() {
               loadTabs(id, tabs);
            });
        }

它只保留最后一个边界(值“四”)。

我正在尝试整合目前有效的这段代码:

        $('#one').click(function() {
            loadTabs(0, tabs);
        });

        $('#two').click(function() {
            loadTabs(1, tabs);
        });

        $('#three').click(function() {
            loadTabs(2, tabs);
        });

        $('#four').click(function() {
            loadTabs(3, tabs);
        });

由于 this post,我想我可能需要关闭.

最佳答案

您在 other post 中读到的内容是正确的. 您需要创建一个闭包以将参数绑定(bind)到每个 onclick 处理程序:

$('#' + tabs[i]).bind(
    'click', 
    (function(id) {
        return function() 
        {
            loadTabs(id, tabs);
        };
    })(id)
);

您可能还想查看 currying . 在此示例中,您可以创建一个小的辅助函数,它将第一个参数绑定(bind)到传递的函数并返回新函数。

function curry(func, arg1)
{
    return function()
    {
        func(arg);
    };
}

然后像这样把它们放在一起:

$('#' + tabs[i]).bind(
    'click', 
    curry(function(id) { loadTabs(id); }, id)
);

请注意,我的 curry 函数不符合 currying 的定义,因为它忽略了任何其他参数。但它应该适用于您的情况。

关于javascript - 在循环中绑定(bind)事件处理程序需要关闭吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8624057/

相关文章:

iterator - 如何将盒装闭包传递给 `take_while` ?

Swift 递归函数,返回类型 Closure

swift - 如何在 swift 中使用闭包作为函数的第二个参数?

javascript - 节点中的 jstree 输入元素没有焦点

javascript - Flot.js 设置 y 轴标签格式以显示两位小数

jquery - 如何获取每个匹配元素的innerHTML

javascript - 聊天应用可滚动的 div 或 Iframe

javascript - 使用单选按钮显示/隐藏表单元素

javascript - 使用 async wait 将函数一个接一个地链接起来

javascript - 使用 Node 、mysql、express 和纯 js 从数据库中删除一行