17
supposedlyGlobalVariable := "blah"

ARoutine()
{
   localVariable := "asdf"
   MsgBox, The global variable value is %supposedlyGlobalVariable%.  The local variable value is %localVariable%.
}


^!X:: ;This assigns the hotkey CTRL + ALT + X to run the routine
ARoutine()
return

运行代码,结果是:

"The global variable value is .  The local variable value is asdf."

文档指出:

变量作用域和声明:除函数中的局部变量外,所有变量都是全局的;也就是说,脚本的任何部分都可以读取或更改它们的内容。

为什么我的全局变量在函数内没有作用域?

4

4 回答 4

15

全局变量的文档可以在这里找到:
https ://autohotkey.com/docs/Functions.htm#Global

全局变量

要在函数中引用现有的全局变量(或创建一个新变量),请在使用之前将该变量声明为全局变量。例如:

LogToFile(TextToLog)
{
    global LogFileName
    FileAppend, %TextToLog%`n, %LogFileName%
}

我相信 AHK 的全球概念与其他语言有点不同。使用 AHK,您可以创建一个变量并在多个热键和子例程中使用它,而无需将其声明为全局变量。

Gv := 0

f1::SetTimer, Action, % (on:=!on) ? (1000) : ("Off")

Action:
    Gv++
    trayTip,, % Gv
Return

f2::Msgbox, % Gv

代码解释:

  • F1键切换计时器以运行子程序:每Action毫秒1000
  • %开始一个表达式。
  • on:=!onon每次F1按下 时反转变量的二进制值。
  • ?:合称为三元运算符。
  • 当 on=1 时延迟设置为1000ms;当 on=0 时,计时器打开Off

++ 运算符将变量 Gv 加 1 。

于 2012-04-18T18:54:46.953 回答
8

这使事情变得更容易:

https://www.autohotkey.com/docs/Functions.htm#SuperGlobal

超全局变量 [v1.1.05+]:如果全局声明出现在任何函数之外,默认对所有函数生效(不包括强制局部函数)。这避免了在每个函数中重新声明变量的需要。但是,如果声明了同名的函数参数或局部变量,则它优先于全局变量。class 关键字创建的变量也是超全局的。

只需在主脚本中将您的变量声明为全局变量:

global supposedlyGlobalVariable := "blah"
于 2019-02-18T11:46:05.970 回答
-1

P.Brian,当你这样做时它会起作用..我知道它没有解释为什么,但这可能是你的解决方法。

#Persistent
GlobalVariable = "blah"
RETURN

ARoutine:
{
   localVariable := "asdf"
   MsgBox, The global variable value is %GlobalVariable%.  The local variable value is %localVariable%.
}
Return

^!X:: ;This assigns the hotkey CTRL + ALT + X to run the routine
gosub, ARoutine
return
于 2012-04-18T15:30:31.563 回答
-1

您只需在函数内将变量声明为全局变量

supposedlyGlobalVariable := "blah"

ARoutine()
{
   global supposedlyGlobalVariable
   localVariable := "asdf"
   MsgBox, The global variable value is %supposedlyGlobalVariable%.  The local variable 
value is %localVariable%.
}


^!X:: ;This assigns the hotkey CTRL + ALT + X to run the routine
ARoutine()
return
于 2018-06-27T00:05:06.917 回答