VBScriptのスコープについて
VBScriptのコードをいじるようになって、少し気になったのがスコープの範囲。
ちょっと注意しなければいけないなと個人的に思うことがあったので、まとめてみようと思う。
各関数ごとにDimを使って変数を定義している場合
各関数の中でメモリが割り当てられているようで、各々が値を保持していることがわかる。
これはスクリプト実行時に「多重定義のエラー」が出ないことから予想していたのでしっくりきた。
sample.vbs
Dim val
val = 2
WScript.Echo val ' 2が表示される
chg1
WScript.Echo val ' 2が表示される
chg2
WScript.Echo val ' 2が表示される
Function chg1
Dim val
val = 3
WScript.Echo val ' 3が表示される
End Function
Function chg2
Dim val
val = 4
WScript.echo val ' 4が表示される
End Function
関数の外で変数を定義し、変数を使いまわした場合
変数に格納された最後の値が表示された。
sample.vbs
Dim val
val = 2
WScript.Echo val ' 2が表示される
chg1
WScript.Echo val ' 3が表示される
chg2
WScript.Echo val ' 4が表示される
Function chg1
val = 3
WScript.Echo val ' 3が表示される
End Function
Function chg2
val = 4
WScript.echo val ' 4が表示される
End Function
まとめ
各関数ごとに責任を持たせるのであれば、各関数ごとに変数を定義するのがベターだと思う。
「関数の中で閉じる変数のつもりが、グローバルになっていた」なんてことにならないように、Option Explicitを使って「定義していない変数は使えないようにする」のと合わせるとなおよい。