AHK 中有兩種比較像的東西,標簽和函數。
標簽
標簽比較簡單,用來標記一段代碼的位置,以 return 結束。
Gosub, Test
Goto, Test
; 不再執行
MsgBox, End
Test:
MsgBox, Test
return
Test 就是一個標簽。標簽可以用 Gosub 調用,Gosub 執行完后會繼續執行下一行。也可以用 Goto 調用,但 Goto 調用完就不會回來了。
除了使用 Gosub 或者 Goto 調用,標簽還可以作為其他命令的參數,比如 Hotkey、SetTimer 等等。
標簽里的代碼默認是執行的。比如這樣一個 AHK 文件。
MsgBox, Begin
Test:
MsgBox, Test
return
即使沒有主動調用 Test 標簽,Test 標簽里的內容還是會被執行。
可以使用動態的標簽名來調用標簽。
labelName := "Test"
; IsLabel 函數用來判斷標簽是否存在
if (IsLabel(labelName))
{
Gosub, %labelName%
}
函數
函數也可以實現標簽的功能,但更強大和靈活。
Test1()
Test2("test")
Test1()
{
MsgBox, Test1
}
; 函數支持參數和返回值
Test2(text)
{
MsgBox, % text
return true
}
函數的調用方式是函數名加小括號,如果需要傳遞參數,在括號里添加參數。和標簽不一樣,函數里的代碼默認是不執行的。
可以使用動態的標簽名來調用函數。
functionName := "Test"
; IsFunc 函數用來判斷函數是否存在
if (IsFunc(functionName))
{
%functionName%()
}
函數里可以調用標簽,標簽里也可以調用函數。標簽和函數可以重名。
函數里的標簽
在函數里可以再定義標簽。
Test()
{
Gosub, Test2
return
Test2:
MsgBox, Test2
return
}
代碼中 Test2 是一個內部標簽,只能在 Test 函數中訪問。但不同函數中的內部標簽也不能夠重名,即所有的標簽名必須是唯一的。
標簽和函數的區別
總結下標簽和函數的區別:
- 定義和調用的方式不同。
- 函數支持參數和返回值,標簽不支持。
- 標簽默認是執行的,函數默認不執行。
- 調用標簽的開銷比調用函數小,調用空函數的耗時比調用空標簽多百分之幾十。
- 函數中可以使用局部變量和靜態變量,但標簽中只能使用全局變量。
- 某些場景可能只允許用標簽,但最新的 AHK 版本基本所有場景都可以用函數了(如果以后想起來有不可取代的場景再補充)。
那么是使用標簽還是函數呢?
通常情況,使用函數就可以了。如果考慮到性能,在無需參數和返回值的情況可以用標簽取代函數。除非一個函數被高頻率地調用,否則優化的效果不大。
付費解決 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等領域相關問題,靈活定價,歡迎咨詢,微信 ly50247。