在运行时将变量更改为文字?

时间:2009-02-16 15:28:23

标签: javascript mootools

我是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)

谢谢, 卡梅伦

2 个答案:

答案 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 - 使用事件处理程序的闭包。