AHK 中有兩種比較像的東西蚪黑,標簽和函數盅惜。
標簽
標簽比較簡單,用來標記一段代碼的位置忌穿,以 return 結束抒寂。
Gosub, Test
Goto, Test
; 不再執(zhí)行
MsgBox, End
Test:
MsgBox, Test
return
Test 就是一個標簽。標簽可以用 Gosub 調用掠剑,Gosub 執(zhí)行完后會繼續(xù)執(zhí)行下一行屈芜。也可以用 Goto 調用,但 Goto 調用完就不會回來了。
除了使用 Gosub 或者 Goto 調用井佑,標簽還可以作為其他命令的參數属铁,比如 Hotkey、SetTimer 等等躬翁。
標簽里的代碼默認是執(zhí)行的焦蘑。比如這樣一個 AHK 文件。
MsgBox, Begin
Test:
MsgBox, Test
return
即使沒有主動調用 Test 標簽姆另,Test 標簽里的內容還是會被執(zhí)行喇肋。
可以使用動態(tài)的標簽名來調用標簽。
labelName := "Test"
; IsLabel 函數用來判斷標簽是否存在
if (IsLabel(labelName))
{
Gosub, %labelName%
}
函數
函數也可以實現標簽的功能迹辐,但更強大和靈活。
Test1()
Test2("test")
Test1()
{
MsgBox, Test1
}
; 函數支持參數和返回值
Test2(text)
{
MsgBox, % text
return true
}
函數的調用方式是函數名加小括號甚侣,如果需要傳遞參數明吩,在括號里添加參數。和標簽不一樣殷费,函數里的代碼默認是不執(zhí)行的印荔。
可以使用動態(tài)的標簽名來調用函數。
functionName := "Test"
; IsFunc 函數用來判斷函數是否存在
if (IsFunc(functionName))
{
%functionName%()
}
函數里可以調用標簽详羡,標簽里也可以調用函數仍律。標簽和函數可以重名。
函數里的標簽
在函數里可以再定義標簽实柠。
Test()
{
Gosub, Test2
return
Test2:
MsgBox, Test2
return
}
代碼中 Test2 是一個內部標簽水泉,只能在 Test 函數中訪問。但不同函數中的內部標簽也不能夠重名窒盐,即所有的標簽名必須是唯一的草则。
標簽和函數的區(qū)別
總結下標簽和函數的區(qū)別:
- 定義和調用的方式不同。
- 函數支持參數和返回值蟹漓,標簽不支持炕横。
- 標簽默認是執(zhí)行的,函數默認不執(zhí)行葡粒。
- 調用標簽的開銷比調用函數小份殿,調用空函數的耗時比調用空標簽多百分之幾十。
- 函數中可以使用局部變量和靜態(tài)變量嗽交,但標簽中只能使用全局變量卿嘲。
- 某些場景可能只允許用標簽,但最新的 AHK 版本基本所有場景都可以用函數了(如果以后想起來有不可取代的場景再補充)轮纫。
那么是使用標簽還是函數呢腔寡?
通常情況,使用函數就可以了掌唾。如果考慮到性能放前,在無需參數和返回值的情況可以用標簽取代函數忿磅。除非一個函數被高頻率地調用,否則優(yōu)化的效果不大凭语。
付費解決 Windows葱她、Linux、Shell似扔、C吨些、C++、AHK炒辉、Python豪墅、JavaScript、Lua 等領域相關問題黔寇,靈活定價偶器,歡迎咨詢,微信 ly50247缝裤。