AutoHotKey v2 的语法受到 JavaScript 的影响挺大的嘛

虽然还有很多不同,以及细节上的区别。但是实际书写起来从 JS 到 AHK 总体感觉是顺手的,这比 v1 那种需要彻底切换语法的感觉好多了。

我是小白,不会其他的。但看网上有人说好像和 C++、java、C#类似。
来源:
1.“很多人现在都直接把ahk当c#的替代品了”
2.“AutoHotkey 所用的语言类C++或JAVA”

V2,语法上从 JS 过渡过来很多东西可以跟着直觉去写了。

你给的参考链接中内容有点早,说的不是 V2 语法

c++跟js本就像,有很多直接可通用。

诶!那我可以去看看 C++ 了(好像也用不上

ahk 更像是类似 basic 这类基于过程的语言.

java这类都是面向对象的语言.

ahk class有基本的继承关系
想面向对象也不算多难
但它没有访问修饰符…导致继承或访问起来都乱七八糟的

比方说它属性的有 set get
这点像c#,虽然没那么智能不能自动生成私有变量
比方说按照c#的思路_name 这个变量是完全私有的
但现在_name在外部也能访问到,属性一多看着就烦
虽然没多少属性需要手动设置 set get

t := test()
t.Name := 123
MsgBox(t._name)
MsgBox(t.Name)

class test 
{
    _name := ""
    Name{
        get => this._name
        set => this._name := Value
    }
}

另外ahk没有扩展函数
导致它不像其他语言那样能直接对常见类型操作

t := "sss"
; t.Replace("ss") ;没有扩展函数不能如此操作
t := StrReplace(t, "ss")
MsgBox(t)

; 但有没那么优雅的办法实现
t := str("sss")
t.Replace("ss")
MsgBox(t.str)


class str
{
    __New(s)
    {
        this.str := s
    }

    Replace(need, replace := "")
    {
        this.str := StrReplace(this.str, need, replace)
    }
}
1 个赞

最近遇到的一个是局部变量问题,一个是上下文问题。

开始我认真的声明需要用到的 global 变量,结果发现根本不需要,直接读外面的变量(我记得以前不是的),还能直接写外面的变量。行吧,我就按着 JS 的作用域去理解,大概也没出差错。

下一个上下文问题就比较烦,用循环给多个同类元素添加事件,同时事件带有动态的参数,然后参数读到的都是最后的值,这里让我混乱。

匿名函数似乎只能是胖箭头函数?但胖箭头函数后面只能是一个表达式,唔,想用大括号

我认为V2的缺点还是性能不行,要是有类似lua的性能就好了。

前端开发者表示谈性能就……感觉啥性能都比前端好(

作用域好像AHK只区分了函数内部和外部? (或者加上class之类)
当然还有嵌套函数之类,也是遵守此规则,
外部的全部为全局变量
函数能读取全局变量但不能修改
总之尽量避免和全局变量同名的变量免得造成困扰

上下文的问题还是给出简单示例比较好,或者去问AI,这些问题AI应该很懂

匿名函数的确只能表达式,但也能勉强写一部分除循环等特殊情况之外外逻辑

n := 123
test()
MsgBox("这是函数外部 " n)
MsgBox("这是函数内声明的全局变量 " n1 + 100)

t(1,10)


test()
{
    global n1
    n1 := 123
    ; n := n+1 ;内部不能修改只能读取外部函数会报错
    MsgBox("这是函数内部 " n)
}


t(s,t) => (s ? (t++,MsgBox("这是匿名函数 " t)) : "")

都是能理解,或者能变通的小问题,就是不顺手(

但是相比 v1,没那么不顺手了

v1的变量声明有两种形式,我到现在还搞不灵清

我也学过几种编程语言,但 AHK v1 让我觉得十分的别扭无法习惯,所以现在用 v2 感觉没那么虐了,就感动的呜呜呜的

我感觉v1 是为了尽量简化和方便代码的, 所以语法并不规范, 有很多为了特性而添加的关键字和方法.

到了v2, 语法规范了一些, 属性的归属性, 方法的归方法, 有一些面向对象的语法规范了.

问题是以前不规范是为了简洁方便服务, 现在丢掉了简洁(删除了大量的常用语句, 比如删除了所有if开头的语句 ), 又哩哩啦啦, 难舍难分 , 语法改造的并不彻底, 还是个四不像.

对于v1用户来说, 不亚于重学一门语言. 但这门语言还只是为ahk服务的.

其实哪怕彻底改造成js 的子集, 也比现在强吧.

1 个赞

十分认同!

直接借用任何一种常见语言的语法都行,然后加一些特有的方法即可

能不能写得像C++,可以。但是以Prototype这样的以继承链为基础的JavaScript,和C++差别巨大。

protoypte跟c++是不同,而if else等是完全相同的,可直接使用。