2013-10-17 31 views
2

我試圖在JavaScript中爲數字1至9設置一些關鍵綁定,然後單擊頁面上標記爲'show1','show2'的各種鏈接,等等。如何將一個變量傳遞到for循環中的某個函數

問題是它爲數字創建鍵綁定,但它總是顯示最後一項,即:'show9'。

下面是一個例子,如果您在鍵盤上按1或2,則該功能將返回3,當它應該分別返回1 & 2。

for i in [1..2] 
    key i.toString(), (e) -> 
     alert i 

http://jsfiddle.net/DARxg/

+2

如果我只知道如何製作咖啡文件中的IIFE ... –

+1

不是一個騙局 - 至少不是那個問題 - OP是使用咖啡文本。我更新了標籤。 –

+0

@AdamRackis:您可以使用['do(i) - > ...'](http://stackoverflow.com/a/11996382/479863)或者手動使用[與JavaScript中的括號一樣](http: //jsfiddle.net/ambiguous/LEBQv/)。 –

回答

3

的功能你要創建一個具有持久參考i變量,而不是它的一個副本創建功能時,這就是爲什麼你總是看到它的最終值(3)。

更新:在答案的末尾還有一個CoffeeScript-ish的方式,儘管閱讀整個事情是非常有用的,所以你可以理解這些權衡。

相反,使用創建關閉了一個不同的變量函數的設計器功能,一個是不會改變:Updated Fiddle

buildHandler = (value) -> 
    (e) -> 
     alert value 
     return 

for i in [1..2] 
    key i.toString(), buildHandler i 

在那裏,我們的處理函數關閉了我們通過buildHandler的說法,等它不會改變。

更多:Closures are not complicated(但基於JavaScript的,而不是CoffeeScript的)


對於那些誰真的想立即調用的函數表達式(IIFEs)(我不建議IIFEs在循環中,從理論上說創建一個新的功能,每次都只是把它扔掉,這是很難讀):

for i in [1..2] 
    key i.toString(), (
     (value) -> 
      (e) -> 
       alert value 
       return 
     )(i) 

mu is too short指出在評論認爲咖啡eScript有一個關鍵字可以做到這一點:do它接近文檔的this section的末尾。使用它,因爲這將是這樣的:

for i in [1..2] 
    key i.toString(), do (i) -> (e) -> 
     alert i 
     return 

現在,被轉換爲JavaScript創建不必要的功能,並引發他們去(像上面的IIFE一樣),但對於一些使用情況下,它可能沒有按」沒關係。我仍然可能會爲了我上面的第一個選項的清晰度而去,但是在腰帶上有很多工具是很好的。

+0

CoffeeScript具有專門用於這種事情的'do'關鍵字,請參閱本節的底部:http://coffeescript.org/#loops –

+0

@ muistooshort:哇,謝謝!我已將它摺疊起來。 –

+0

謝謝您的深入解答。我同意你的第一個答案更容易閱讀。 – map7

相關問題