Function Objects

AutoHotKey

函数对象

"函数对象"泛指以下内容:

  • 函数对象, 即函数的对象形式; 包含内置函数及脚本定义的函数
  • 支持像函数一样被调用的用户定义的对象.亦称为"函数子".
  • 其他支持像函数一样被调用的对象,如,函数绑定对象,或,COM方法返回的JavaScript函数对象.

函数对象可被以下对象使用:

用户定义函数

用户定义函数对象应按以下模式:

class YourClassName {
    Call(a, b) {  ;声明参数,或数组*.
        ;...
    }
    __Call(method, args*) {
        if (method = "")  ;对%fn%()或fn.()
            return this.Call(args*)
        if (IsObject(method))  ; 如果此函数对象作为方法被使用.
            return this.Call(method, args*)
    }
    ;...
}

模式中各个部分适用于不同的使用情形,如下:

  • 如果脚本按%this%()this.()的形式调用,则,method(方法名)的值是空字符串.
  • 如果对象作为方法被调用,则IsObject(method)返回真,并且method包含关于目标对象的引用.如:若x.y指向this 函数对象,则x.y()this[x]()this.__Call(x)this.Call(x).
  • [v1.1.20+]:如果对象被某需要回调函数的内置函数所使用,如OnMessage或SetTimer,则此对象仅需支持Call方法即可.

上述过程可以直接在__Call中完成,推荐使用__Call代替Call以便更好的迁移到V2版本,其会改变%this%()的行为及调用CALL的方法调用.

函数绑定对象[v1.1.20+]

行为像函数,但仅将传递给自己的参数绑定至另一个函数.

有两种建立函数绑定对象的方式:

  • 调用Func.Bind()方法,其绑定参数值至一个函数
  • 调用ObjBindMethod()函数,其绑定参数值及方法名至目标对象.

函数绑定对象可按如下实例调用.不支持其他方法.当函数绑定对象被调用时,它调用被绑定的函数或方法,传递绑定的参数,及调用时的参数.例如:

fn := Func("RealFn").Bind(1)

%fn%(2)    ; 显示 "1, 2"
fn.Call(3) ; 显示 "1, 3"

RealFn(a, b) {
    MsgBox %a%, %b%
}

ObjBindMethod()用于绑定无法引用的方法.例如:

file := FileOpen(A_ScriptFullPath, "r")
getLine := ObjBindMethod(file, "ReadLine")
MsgBox % %getLine%()  ;显示此文件的第一行.

更多复杂的例子, 请参阅 SetTimer.