2012-11-22 33 views
4

我想換成這樣的:喜歡的東西函數引用,而不是函數體 - 在一個循環(帶參數)

for(var i=0; i<elementArray.length; i++) 
    elementArray[i].click(function(){ 
     console.log("element clicked - selectedElementIndex = " + i);      
    }); 

for(var i=0; i<elementArray.length; i++) 
    elementArray[i].click(onElementClick(i)); 

function onElementClick(i){ 
    console.log("element clicked - selectedElementIndex = " + i); 
} 

我該怎麼辦呢? :)

+0

執行了全部的循環看起來像。請將其作爲編輯發佈,而不要使用'...' – 0x499602D2

回答

4

因爲(據我所知)單擊處理不能接受參數,你需要做一個函數變量在範圍內,應該看起來像這樣:

for(...) { 
    elementArray[i].click(onElementClick(i)); 
    ... 
} 

function onElementClick(id){ 
    return function() { 
     console.log("element clicked - selectedElementIndex = " + id); 
    } 
} 
+1

+1關閉很好的工作。 – gdoron

+0

謝謝,這正是我一直在尋找的! –

1

替換:

elementArray[i].click(onElementClick(i)); 

有了:

elementArray[i].click(onElementClick(elementArray[i].id)); 
+0

並且downvote原因...? – gdoron

+0

@eicto,顯然有人認爲如果他downvoted,我想問爲什麼這是不正確的... – gdoron

+0

什麼是'elementArray [i] .id'當他只是使用'ID'?這只是psuedocode什麼的? – 0x499602D2

0

將它包裝在一個函數表達式中:

elementArray[i].click(function() { 

    onElementClick(i); 

}); 

您還需要包裝代碼的函數表達式,以及避免棘手的問題:

(function() { 

    ... 

    for (...) (function(i) { 

     elementArray[i].click(function() { 

      onElementClick(i); 

     }); 

    })(i); 

})(); 
+1

@ san.chez,警告'i'會給你for循環的最後一個值。除非你使用閉包。我太累了,無法解釋......晚安。 **更新:傑夫的答案似乎正是你想要的,我向上投票。** – gdoron

+1

大衛,你根本沒有使用關閉。 – gdoron

+0

@gdoron Meant函數表達式。 – 0x499602D2

0

使用data它可以看起來像:

for (... { 

    elementArray[i].click(onElementClick).data('id',i); 
} 

function onElementClick(){ 
     console.log("element clicked - selectedElementIndex = " + $(this).data('id')); 
} 
相關問題