将索引值绑定到事件处理程序

时间:2012-02-22 17:06:05

标签: javascript closures bind

这里我的目的是遍历一个元素数组,并在每个元素上设置一个事件处理程序,同时还将当前迭代器值绑定到该事件处理程序。我想出的是:

for (var i = 0; i < elementArray.length; ++i)
{
      var elem = elementArray[i];
      elem.onmouseover = function() { foo(i); }
}

function foo(index)
{
       alert(index);
}

这里我使用闭包将i绑定到foo。问题是,当实际调用foo时,i总是等于elementArray.length,因为当调用fooi已经增加达到最大值。我想,我想要的是将i的新副本绑定到每个匿名函数,以便将正确的值传递给foo。但我不确定最好的办法是什么。

2 个答案:

答案 0 :(得分:1)

这不适合您,因为在调用mouseover处理程序时,i的值已更改,它等于elementArray.length。你应该做的是返回一个函数,该函数创建一个闭包并在定义它时保持i的值。

for (var i = 0; i < elementArray.length; ++i)
{
      var elem = elementArray[i];
      elem.onmouseover = foo(i);
}

function foo(index)
{
    return function(){
       alert(index);
    }
}

答案 1 :(得分:0)

您可以使用Function.prototype.bind(或为不支持它的浏览器定义一个)来避免(显式)闭包。然后你的电话会写成:

elem.onmouseover = function(x) { foo(x); }.bind(this, i);