2009-02-16 38 views
0

我是一个初学javascript的人,我想不出解决以下问题的方法。我在这个例子中使用Mootools的,虽然这不是一个MooTools的问题:在运行时将变量更改为文字?

for (var i = 0; i < 5; i++) { 
    myElement[i].addEvent('click', function() { otherFunction(i); }); 
} 

每当有人点击myElement,otherFunction被称为(好),但经过5(不好)。我知道这是因为它acesses我在循环结束后(当他们点击的元素),但我不能为认为任何替代的除了单调

switch(i) { 
    case 1: myElement[i].addEvent('click', function() { otherFunction(1); }); break; 
    case 2: myElement[i].addEvent('click', function() { otherFunction(2); }); break; 
    // ... 
} 

那里的生活一定是一个更好的办法......我觉得我失去了一些东西明显

UPDATE:到myElement添加[I]指数(哎呀)

感谢, 卡梅伦

+0

为什么你需要五个点击处理程序的一个元素?据我所知,这两个代码块将实现不同的目标,这些目标并不明确。 – montrealist 2009-02-16 15:36:40

回答

2

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

这里有一个办法可以解决这个问题:

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

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

这使封闭的创建到另一个范围,将“保留”的

另一种方式是每个值简单地有一个单击处理程序可以分配给每个元素,并计算出事件对象中点击的事件(假设您想将这些处理程序附加到不同的元素上,尽管您的代码表明您需要多个处理程序在相同的 nt,这有点奇怪:)

1

我与评论质疑为什么你需要同意单击五个点击处理程序e元素,但为了实现你想要的东西,你需要使用闭包。

查看本教程JavaScript tutorials

更新:对于某些代码/语法样本,请查看this question I asked here上的完全相同的主题 - 使用事件处理函数的闭包。