2009-02-16 41 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上的完全相同的主題 - 使用事件處理函數的閉包。