2012-04-17 16 views
6
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 

Ejecutar el código y el resultado es:Variable global que no tiene alcance mundial

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

Los documentation estados:

alcance variable y declaraciones: Con la excepción de locales variables en funciones, todas las variables son globales; es decir, su contenido puede ser leído o alterado por cualquier parte del script.

¿Por qué mi variable global no tiene alcance dentro de la función?

Respuesta

9

La documentación para las variables globales se puede encontrar aquí:
https://autohotkey.com/docs/Functions.htm#Global

Las variables globales

para hacer referencia a una variable global existente dentro de una función (o crear un nueva uno), declare la variable como global antes de usarla. Por ejemplo :

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

Creo que el concepto de global, con AHK, es un poco diferente que en otros idiomas. Con AHK puede crear una variable y usarla en varias teclas rápidas y subrutinas, sin declararlo como global.

Gv := 0 

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

Action: 
    Gv++ 
    trayTip,, % Gv 
Return 

f2::Msgbox, % Gv 

Explicación del código:

  • El F1 tecla cambia un temporizador para ejecutar la subrutina: Action cada 1000 ms.
  • % inicia una expresión.
  • on:=!on invierte el valor binario de la variable on cada vez que se presiona F1.
  • ?: juntos se llama operador ternario.
  • Cuando on = 1 delay está establecido en 1000 ms; cuando está en = 0, el temporizador se ha convertido en Off.

El operador ++ agrega 1 a la variable Gv.

+0

Eso es contra-intuitivo. Si una variable es global, pero no dentro de una función ... ¿dónde está global sin requerir un modificador? –

+0

@ P.Brian.Mackey He actualizado mi respuesta para tratar su comentario. –

0

P.Brian, Funciona cuando haces esto ... Sé que no explica por qué, pero esta podría ser tu solución.

#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