# 标签

## 目录

- 语法和用法
- 子程序
- 动态标签
- 热键和热字串
- 命名的循环
- 函数
- 相关的

## 语法和用法

标签用来标识代码行, 可以作为 Goto 目标或组成子程序. 标签有三种: 普通的命名标签, 热键标签和热字串标签.

普通的标签由名称和冒号组成.

    this_is_a_label:

热键标签由热键和双冒号组成.

    ^a::

热字串标签由冒号, 零个或多个选项, 另一个冒号, 缩写和双冒号组成.

    :*:btw::

通常, 除了空白和注释之外, 其他代码不能与标签写在同一行上. 然而:

- 热键标签可以直接后跟命令或其他语句来创建 单行 热键. 换句话说, 如果命令, 赋值或表达式与热键标签在同一行上, 那么它的作用就像后跟着 `return` 一样.
- 在双冒号右边写有按键名称的热键实际上是重映射, 这是一对热键的简写. 例如, `a::b` 创建 `*a` 和 `*a Up` 的热键和标签, 而不创建名为 `a` 的标签.
- 在最后一个双冒号的右侧写有文本的热字串是 自动替换 热字串. 自动替换热字符串不能作为标签.

名称: 标签名不区分大小写, 且可以由除空格, tab, 逗号以及转义字符(`) 外的其他字符组成. 然而, 考虑到命名的惯例, 通常最好仅使用字母, 数字和下划线(例如: MyListView, Menu_File_Open 和 outer_loop). 在整个脚本中标签名必须是唯一的.

虽然没有保留的标签名, 但是强烈建议不要使用以下名称: On, Off, Toggle, AltTab, ShiftAltTab, AltTabAndMenu 和 AltTabMenuDismiss. 这些值对 Hotkey 命令有特殊的含义.

目标: 标签的目标是下一个可执行的代码行. 可执行代码包含命令, 赋值, 表达式和区块, 但不包括指令, 标签, 热键或热字串. 在下面的例子中, `run_notepad` 和 `#n` 标签都指向 `Run` 行:

    run_notepad:
    #n::
        Run Notepad
        return

执行: 与指令类似, 正常执行到标签时标签会被忽略. 在下面的例子中, 消息框会显示两次: 一次是在执行 Gosub 的目标子程序时, 再次是在前面的子程序返回后:

    gosub Label1

    Label1:
    MsgBox %A_ThisLabel%
    return

## 子程序

子程序是一部分代码, 可以对它进行 调用 来执行特定的任务. 子程序的执行从目标标签开始, 一直执行到遇上 Return 或 Exit. 由于子程序的结尾决定于流控制, 所以任何标签既作为 Goto 的目标同时也是子程序的开始.

## 动态标签

接受标签名的许多命令也可以接受变量引用(例如 %MyLabel%), 此时变量中保存了目标标签的名称. 然而, 性能会稍微降低, 因为每次都必须 "查找" 目标标签名而不是只在脚本首次加载时查找一次.

## 热键和热字串

每个双冒号热键也会创建一个标签, 除非它是一个函数热键. 标签的名称和脚本中的名称完全相同, 并且可以和 A_ThisHotkey 报告的热键名称不同, 比如说修饰符以不同的顺序写. 标签名称包括热键的修饰符, 但不包括最后的双冒号(`::`).

热字串标签的名称包括前面的冒号和选项, 但不包括最后的双冒号(`::`).

热键和热字串标签也可以作为Goto, Gosub 以及其他命令的有效目标. 然而, 一个热键或热串标签只有在它是给定名称的第一个标签时才能以这种方式使用. 例如:

    gosub ^+a  ; 示例热键.
    gosub +^a  ; 全局热键.
    gosub Esc  ; Esc 标签.
    ExitApp

    #IfWinActive Example
    ^+a::MsgBox Example hotkey.
    Esc:
        MsgBox Esc label.
        return
    #If
    +^a::MsgBox Global hotkey.
    Esc::MsgBox Esc hotkey.

这个限制也适用于 Hotkey 命令的 Label 参数.

## 命名的循环

标签还可以用来标识循环, 以便用于 Continue 和 Break 命令. 这样脚本可以很方便地继续或退出任意数目的内嵌循环.

## 函数

[v1.1.20+]: 函数可以在多种情况下替代原来的标签, 包括:

- Gui 事件(例如 GuiClose)
- Gui 控件事件(g-标签)
- 热键
- 菜单
- SetTimer

函数的好处是它们可以使用局部变量, 在某些情况下(比如 GUI 控件事件), 它们也接受包含有用信息的参数.

## 相关

IsLabel(), A_ThisLabel, Gosub, Goto, OnExit, SetTimer, Hotkey, Gui 事件, g-标签, OnClipboardChange 标签

dftg