Javascript 在循环中绑定事件处理程序需要闭包吗?

Javascript 在循环中绑定事件处理程序需要闭包吗?,javascript,jquery,closures,bind,Javascript,Jquery,Closures,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() { loa

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

        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);
            });
        }

我想我可能需要结束,因为

由于您已经在使用jQuery,因此可以将其用于此任务。因此,正如您正确地假设的那样,您不需要自己使用闭包

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

$.each(tabs, function(idx, tab) {
    $("#" + tab).on("click", function() {
        alert(idx);
        //loadTabs(idx, tabs);
    })
});

你在报纸上读到的东西是对的。 您需要创建一个闭包,将参数绑定到每个onclick处理程序:

$('#' + tabs[i]).bind(
    'click', 
    (function(id) {
        return function() 
        {
            loadTabs(id, tabs);
        };
    })(id)
);
你可能还想调查一下。 在本例中,您可以创建一个小的helper函数,该函数将第一个参数绑定到传递的函数,并返回新函数

function curry(func, arg1)
{
    return function()
    {
        func(arg);
    };
}
然后像这样把它放在一起:

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

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

因此,现在这是从演示的html中的div发出的id名称警报?此外,您的方法假定您将按照特定顺序(选项卡数组)添加它们。关键是要使它更加模块化,这样顺序就不重要了。@bob_cobb:在我的示例中,数组中当前项的索引会发出警报。但那只是为了调试;你的第二个评论毫无意义,因为你在循环中也做了同样的事情,只不过要复杂得多。然而,你所说的“更模块化”是什么意思?我想不出在什么情况下我能以其他任何方式解决你发布的这个问题。
$('#' + tabs[i]).bind(
    'click', 
    curry(function(id) { loadTabs(id); }, id)
);