这里我的目的是遍历一个元素数组,并在每个元素上设置一个事件处理程序,同时还将当前迭代器值绑定到该事件处理程序。我想出的是:
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
,因为当调用foo
时i
已经增加达到最大值。我想,我想要的是将i
的新副本绑定到每个匿名函数,以便将正确的值传递给foo
。但我不确定最好的办法是什么。
答案 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);