0

我是 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;
    // ...
}

必须有更好的方法......我觉得我错过了一些明显的东西

更新:向 myElement 添加了 [i] 索引(哎呀)

谢谢,卡梅伦

4

2 回答 2

2

您的代码是闭包的一个示例 - 匿名函数引用i的最后一个值,因为它有效地保留了外部范围以供以后在调用函数时使用。

这是您可以修复它的一种方法:

function getClickHandler(i)
{ 
   return function () { otherFunction(i); }
}

for (var i = 0; i < 5; i++) {
    myElement.addEvent('click', getClickHandler(i));
}

这会将闭包的创建移动到另一个范围,该范围将“保留” i的每个值

另一种方法是简单地拥有一个单击处理程序,该处理程序可以分配给每个元素并确定从事件对象中单击了哪个(假设您要将这些处理程序附加到不同的元素,尽管您的代码建议您需要多个处理程序相同的元素,这有点奇怪:)

于 2009-02-16T15:41:48.827 回答
1

我同意评论质疑为什么一个元素需要五个点击处理程序,但是要完成你想要的,你需要使用闭包。

看看这个关于JavaScript 教程的教程

更新:对于一些代码/语法示例,请查看我在此处就同一主题提出的这个问题 - 使用事件处理程序的闭包。

于 2009-02-16T15:41:31.370 回答