2012-04-17 19 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 

コードを実行していないと、結果は次のとおりです。グローバル変数はグローバルスコープ

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

documentation状態:

変数のスコープと宣言:地元の例外を除いて関数内の変数 、すべての変数はグローバルです。すなわち、その内容は であり、のいずれかのの部分を読んだり変更したりすることができます。

グローバル変数のスコープが関数内にないのはなぜですか?

答えて

9

グローバル変数のドキュメントはここで見つけることができます:関数内の既存のグローバル変数を参照してください(または 新しいを作成するには
https://autohotkey.com/docs/Functions.htm#Global

グローバル変数

を1)、それを使用する前に変数をグローバルとして宣言します。 例えば:

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 

、について説明:Actionすべての1000 MS:

  • F1はキーは、サブルーチンを実行するためにタイマーを切り替えます。
  • %は式を開始します。
  • on:=!onは、F1を押すたびに、変数onのバイナリ値を反転します。
  • ?:を総称して三項演算子と呼びます。
  • オンの場合、遅延は1000 msに設定されます。 on = 0の場合、タイマーはOffになります。

++演算子は、変数Gvに1を加算します。

+0

これは直感的ではありません。変数がグローバルであるが関数内にない場合...修飾子を必要とせずにグローバル変数はどこにありますか? –

+0

@ P.Brian.Mackey私はあなたのコメントに対処するために私の答えを更新しました。 –

0

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