Global variable does not have global scope

拟墨画扇 提交于 2020-01-01 08:27:35

问题


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

Run the code and the result is:

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

The documentation states:

Variable scope and declarations: With the exception of local variables in functions, all variables are global; that is, their contents may be read or altered by any part of the script.

Why does my global variable not have scope within the function?


回答1:


The documentation for global variables can be found here:
https://autohotkey.com/docs/Functions.htm#Global

Global variables

To refer to an existing global variable inside a function (or create a new one), declare the variable as global prior to using it. For example:

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

I believe the concept of global, with AHK, is a bit different than in other languages. With AHK you can create a variable and use it within multiple hotkeys, and subroutines, without declaring it as global.

Gv := 0

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

Action:
    Gv++
    trayTip,, % Gv
Return

f2::Msgbox, % Gv

Explaination of code:

  • The F1 key toggles a timer to run the subroutine: Action every 1000ms.
  • % starts an expression.
  • on:=!on reverses the binary value of variable on every time F1 is pressed.
  • ?: together is called the ternary operator.
  • When on=1 delay is set to 1000ms; when on=0 the timer is turned Off.

The ++ operator adds 1 to variable Gv.




回答2:


This makes things easier:

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

Super-global variables [v1.1.05+]: If a global declaration appears outside of any function, it takes effect for all functions by default (excluding force-local functions). This avoids the need to redeclare the variable in each function. However, if a function parameter or local variable with the same name is declared, it takes precedence over the global variable. Variables created by the class keyword are also super-global.

Just declare your variable as global in the main script:

global supposedlyGlobalVariable := "blah"



回答3:


P.Brian, It works when you do this.. I know it doesn't explain why, but this might be your workaround.

#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



回答4:


You just need to declare the variable as global inside your function

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


来源:https://stackoverflow.com/questions/10198900/global-variable-does-not-have-global-scope

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!