[基礎] AHK 中標簽和函數的用法

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 函數中訪問。但不同函數中的內部標簽也不能夠重名,即所有的標簽名必須是唯一的。

標簽和函數的區別

總結下標簽和函數的區別:

  1. 定義和調用的方式不同。
  2. 函數支持參數和返回值,標簽不支持。
  3. 標簽默認是執行的,函數默認不執行。
  4. 調用標簽的開銷比調用函數小,調用空函數的耗時比調用空標簽多百分之幾十。
  5. 函數中可以使用局部變量和靜態變量,但標簽中只能使用全局變量。
  6. 某些場景可能只允許用標簽,但最新的 AHK 版本基本所有場景都可以用函數了(如果以后想起來有不可取代的場景再補充)。

那么是使用標簽還是函數呢?

通常情況,使用函數就可以了。如果考慮到性能,在無需參數和返回值的情況可以用標簽取代函數。除非一個函數被高頻率地調用,否則優化的效果不大。

付費解決 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等領域相關問題,靈活定價,歡迎咨詢,微信 ly50247。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 86.復合 Cases 共享相同代碼塊的多個switch 分支 分支可以合并, 寫在分支后用逗號分開。如果任何模式...
    無灃閱讀 1,412評論 1 5
  • 一、溫故而知新 1. 內存不夠怎么辦 內存簡單分配策略的問題地址空間不隔離內存使用效率低程序運行的地址不確定 關于...
    SeanCST閱讀 7,867評論 0 27
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,869評論 18 139
  • 孩子在家不聽話、長時間看電視、吵著要買玩具、不想寫作業… 面對這些情況的時候,確實讓家長頭疼。特別是在我們又累又疲...
    重啟的魚閱讀 1,217評論 0 1
  • 秋意漸濃,伴隨著雙臺風的光臨,天氣是越發的冷了。這幾天穿起來秋衣,穿起了鞋襪。 由于太久沒穿鞋的緣故,...
    yeats03131閱讀 227評論 0 1