我試圖在JavaScript中爲數字1至9設置一些關鍵綁定,然後單擊頁面上標記爲'show1','show2'的各種鏈接,等等。如何將一個變量傳遞到for循環中的某個函數
問題是它爲數字創建鍵綁定,但它總是顯示最後一項,即:'show9'。
下面是一個例子,如果您在鍵盤上按1或2,則該功能將返回3,當它應該分別返回1 & 2。
for i in [1..2]
key i.toString(), (e) ->
alert i
我試圖在JavaScript中爲數字1至9設置一些關鍵綁定,然後單擊頁面上標記爲'show1','show2'的各種鏈接,等等。如何將一個變量傳遞到for循環中的某個函數
問題是它爲數字創建鍵綁定,但它總是顯示最後一項,即:'show9'。
下面是一個例子,如果您在鍵盤上按1或2,則該功能將返回3,當它應該分別返回1 & 2。
for i in [1..2]
key i.toString(), (e) ->
alert i
的功能你要創建一個具有持久參考到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一樣),但對於一些使用情況下,它可能沒有按」沒關係。我仍然可能會爲了我上面的第一個選項的清晰度而去,但是在腰帶上有很多工具是很好的。
CoffeeScript具有專門用於這種事情的'do'關鍵字,請參閱本節的底部:http://coffeescript.org/#loops –
@ muistooshort:哇,謝謝!我已將它摺疊起來。 –
謝謝您的深入解答。我同意你的第一個答案更容易閱讀。 – map7
如果我只知道如何製作咖啡文件中的IIFE ... –
不是一個騙局 - 至少不是那個問題 - OP是使用咖啡文本。我更新了標籤。 –
@AdamRackis:您可以使用['do(i) - > ...'](http://stackoverflow.com/a/11996382/479863)或者手動使用[與JavaScript中的括號一樣](http: //jsfiddle.net/ambiguous/LEBQv/)。 –