我是javascript的初学者,我无法想到解决以下问题的方法。我在这个例子中使用Mootools,虽然这不是Mootools的问题:
for (var i = 0; i < 5; i++) {
myElement[i].addEvent('click', function () { otherFunction(i); });
}
每当有人点击myElement时,都会调用otherFunction(好)但传递5(坏)。我知道这是因为它在循环完成之后(当他们点击元素时)它会进入,但我不能想到除了单调之外的任何其他选择
switch(i) {
case 1: myElement[i].addEvent('click', function () { otherFunction(1); }); break;
case 2: myElement[i].addEvent('click', function () { otherFunction(2); }); break;
// ...
}
必须有更好的方法......我觉得我错过了一些明显的东西
更新:将[i]索引添加到myElement(oops)
谢谢, 卡梅伦
答案 0 :(得分:2)
你的代码是一个闭包的例子 - 匿名函数引用了 i 的最后一个值,因为它有效地保留了外部作用域,以便在调用函数时供以后使用。
以下是解决问题的方法之一:
function getClickHandler(i)
{
return function () { otherFunction(i); }
}
for (var i = 0; i < 5; i++) {
myElement.addEvent('click', getClickHandler(i));
}
这会将闭包的创建移动到另一个范围,该范围将“保留” i的每个值
另一种方法是只需要一个单击处理程序,可以将其分配给每个元素并找出从事件对象中单击的内容(假设您要将这些处理程序附加到不同的元素,尽管您的代码建议您需要多个相同元素上的处理程序,这有点奇怪:)
答案 1 :(得分:1)
我同意评论质疑为什么你需要为一个元素提供五个点击处理程序,但要完成你想要的,你需要使用一个闭包。
在JavaScript tutorials上查看本教程。
更新:对于某些代码/语法示例,请查看同一主题的this question I asked here - 使用事件处理程序的闭包。