介绍
Lambda和bind在AHK中十分常见,两者的作用也很相似,我常用来创造闭包环境,大多数情况下使用前者就够了,然而,有时只能使用bind。
下面我将介绍这两个的使用方法,及后者的优势。
Lambda
也被称为箭头函数,形式如下:
(*) => MsgBox(0)
(arg, *) => MsgBox(arg)
一个场景是保存在一个变量中,方便传递和调用:
lambda := (arg, *) => MsgBox(arg)
; 调用
lambda(1)
另一个场景是在Gui中,作为事件的回调参数:
g.AddText().OnEvent('click', (*) => MsgBox(0))
其他场景也类似。
Bind
Bind是函数上的一个方法,调用时返回一个绑定函数对象,细节请看文档。
简单的例子如下:
Fn(arg) {
MsgBox(arg)
}
bindFn := Fn.bind(0)
bindFn()
看起来似乎和箭头函数一样,但Bind可以解决在循环中传值的问题,见下面的例子:
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')
}
结果每次调用都显示2。
而使用Bind便不会有这个问题,因为作用域一致:
arr := [0, 1, 2]
for v in arr
HotKey(v, MsgBox.bind(v), 'On')
总结
以上,演示了两种语法的使用方式。
在大多数情况下,我依旧倾向于使用Lambda,不过,在涉及到作用域情况下,记得使用Bind。
浙公网安备 33010602011771号