介绍

Lambdabind在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

posted on 2025-06-05 13:52  落寞的雪  阅读(44)  评论(0)    收藏  举报