【问题标题】:Global variable does not have global scope全局变量没有全局范围
【发布时间】:2012-04-29 05:53:18
【问题描述】:
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."

documentation 声明:

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

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

【问题讨论】:

  • 您是否将“supposedlyGlobalVariable”指定为顶部的全局?如果在声明其值之前添加“Global supposedlyGlobalVariable”行,它将起作用。编辑:哦,我明白了,看起来你没有。

标签: autohotkey


【解决方案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

【讨论】:

  • 当然,这行得通 - 但不是答案。为什么要在这里改为使用子程序? OP 想在函数中使用该变量。首先,您甚至不需要将其设为 Global 即可在子例程中使用它。
【解决方案2】:

全局变量的文档可以在这里找到:
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 键切换计时器以运行子例程:Action1000ms。
  • % 开始一个表达式。
  • 每次按下 F1 时,on:=!on 都会反转变量 on 的二进制值。
  • ?: 合称为三元运算符。
  • 当on=1时延迟设置为1000ms;当 on=0 时,定时器开启Off

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

【讨论】:

  • 这是违反直觉的。如果一个变量是全局变量,但不在函数内部......那么它在哪里是全局的而不需要修饰符?
  • @P.Brian.Mackey 我已经更新了我的答案,试图解决您的评论。
  • 不知道为什么这会回答 OP 问题?通常不需要将 Global 放入函数中,这也不是 OP 想要的。
【解决方案3】:

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

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

【讨论】:

  • 完全违背了目的。 OP希望在函数之外声明。你可以在一个函数中声明它,但你必须至少使用该函数一次,然后才能在其他任何地方使用该变量。
  • 它不起作用。我收到错误消息“此变量尚未分配值”并且全局变量为空。
【解决方案4】:

这让事情变得更容易:

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

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

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

global supposedlyGlobalVariable := "blah"

【讨论】:

  • 是的!这就是 OP 需要做的所有事情:如图所示进行修改。或者正如我在评论中建议的那样,只需在顶部添加Global supposedlyGlobalVariable,然后再声明其值。
  • 这不起作用:global test := "1" f11:: msgbox test 我错过了什么吗?
  • 你需要f11::msgbox, % testf11::msgbox, %test%
猜你喜欢
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
相关资源
最近更新 更多