介紹
Lambda和bind在AHK中十分常見,兩者的作用也很相似,我常用來創(chuàng)造閉包環(huán)境,大多數(shù)情況下使用前者就夠了,然而,有時只能使用bind。
下面我將介紹這兩個的使用方法,及后者的優(yōu)勢。
Lambda
也被稱為箭頭函數(shù),形式如下:
(*) => MsgBox(0)
(arg, *) => MsgBox(arg)
一個場景是保存在一個變量中,方便傳遞和調(diào)用:
lambda := (arg, *) => MsgBox(arg)
; 調(diào)用
lambda(1)
另一個場景是在Gui中,作為事件的回調(diào)參數(shù):
g.AddText().OnEvent('click', (*) => MsgBox(0))
其他場景也類似。
Bind
Bind是函數(shù)上的一個方法,調(diào)用時返回一個綁定函數(shù)對象,細節(jié)請看文檔。
簡單的例子如下:
Fn(arg) {
MsgBox(arg)
}
bindFn := Fn.bind(0)
bindFn()
看起來似乎和箭頭函數(shù)一樣,但Bind可以解決在循環(huán)中傳值的問題,見下面的例子:
arr := [0, 1, 2]
for v in arr
HotKey(v, (*) => MsgBox(v), 'On')
看著似乎沒錯,實際便報錯了:(*) => MsgBox(v)中的v未定義。
那么如果定義了呢:
arr := [0, 1, 2]
for v in arr {
_v := v
HotKey(v, (*) => MsgBox(_v), 'On')
}
結(jié)果每次調(diào)用都顯示2。
而使用Bind便不會有這個問題,因為作用域一致:
arr := [0, 1, 2]
for v in arr
HotKey(v, MsgBox.bind(v), 'On')
總結(jié)
以上,演示了兩種語法的使用方式。
在大多數(shù)情況下,我依舊傾向于使用Lambda,不過,在涉及到作用域情況下,記得使用Bind。
浙公網(wǎng)安備 33010602011771號