web-dev-qa-db-ja.com

VBScript関数の可変スコープ

VBScriptの変数スコープについて質問があります。私は次のキーワードがあることを知っています( autoitscript.com から):

  1. Dim =変数名がまだグローバルに存在しない場合はローカルスコープ(この場合、グローバル変数を再利用します!)
  2. グローバル=グローバルスコープで変数の作成を強制します
  3. ローカル=ローカル/関数スコープで変数の作成を強制します

次の.vbsファイルがあると想像してください。

_Dim strPath

strPath = "C:\folder"

DisplayPath strPath

Sub DisplayPath(strPath) 'Does this strPath get it's own local scope?
  MsgBox strPath
End Sub
_

関数内:DisplayPath(strPath)strPathローカル変数ですか?または、関数/サブは、スクリプトのメインセクションの上部にグローバル変数として定義されているstrPathにアクセスできますか?

また、スクリプト言語で可能な、変数を使用するときに変数を定義するのではなく、明示的にDimを使用することのポイントは何ですか?

10
JohnB

strPathプロシージャのDisplayPathは新しい変数になりますが、期待する理由ではなく、コードに微妙な問題があり、問題が曇っています。

Subプロシージャを呼び出す場合、VBScript構文には括弧が含まれません。例えば:-

Sub MyProc(Param1, Param2)
  '' # Do stuff
End Sub

MyProc("Hello", "World")

上記の場合、構文エラーが発生します。それは呼ばれるべきです:-

MyProc "Hello", "World"

これで、パラメーターが1つしかない場合、構文エラーは発生しません。これは、括弧の別の使用が式の一部であるためです。 '(a + b)* c'。の場合:-

DisplayPath(strPath)

VBScriptは「式」を解決します(strPath)そしてresultDisplayPathに渡します。そのthis resultは、新しいストレージを生成し、結果を式に保持します。

で電話しましたか

DisplayPath strPath

新しく作成されたものはありません。

しかし、これはどうですか:-

Sub DisplayPath(something)
  MsgBox something
End Sub

新しいストレージはまだ割り当てられていません。 somethingは、strPathと同じメモリを指します。

編集

以下のコードは機能します:-

Dim strPath

strPath = "c:\folder"

Display


Sub Display()
  MsgBox strPath
End Sub

プロシージャの外でstrPathを宣言すると、グローバルスコープになります。

明示的なDimを使用する点に関して、上記の割り当て行がこのようになったらどうなるでしょうか。

 strPath = "c:\folder"

strPathという新しい変数が存在し、strPathは空のままになります。 常に VBScriptファイルを次の行で開始する必要があります:-

Option Explicit

これにより、使用するすべての変数を明示的にDimする必要があり、デバッグ時間を節約できます。

20
AnthonyWJones