午後にプログラムを書いていたとき、私は変動する再定義の問題に遭遇しました。具体的には、同じ変数が関数の2つの場所で定義され、2つの変数がIFステートメントの2つの部分に配置されました。私はもともと、ステートメントの異なるブロックの2つの定義には効果がないと考えていました。ただし、操作中、IISは変数に再定義を求められ、重複する定義を削除することは正しいです。
問題を解決した後、私は突然、FDREAMのブログ「JavaScript変数はブロックレベルのスコープなし」で記事を読むことを考えました。これら2つは似ているようです。 VBScriptでは、変数にもブロックレベルの範囲がありません。
その記事をもう一度読んだ後、私は実験を行い、結果を得ました:VBScriptでは、関数で定義された変数の範囲は、関数のどこで定義されていても、ブロックレベルではなく関数全体です。したがって、関数の変数は、関数がどこで定義されているかに関係なく、関数全体で使用できます。
この問題を説明するためのいくつかの例を以下に示します。
コードコピーは次のとおりです。
optionexplicit
subfoo()
薄暗い
var = "こんにちは、世界!"
msgboxvar
Endingub
callfoo()
次のコードは上記のコードに相当しますが、VARの定義は関数の最後に配置されます。
コードコピーは次のとおりです。
optionexplicit
subfoo()
var = "こんにちは、世界!"
msgboxvar
薄暗い
Endingub
callfoo()
次の例は、変数がどこに定義されていても、関数全体で使用できることを示しています。もちろん、定義が特別な位置に配置されている場合、コードの明確さに有益であるため、読み取り、変更する方が便利です。
コードコピーは次のとおりです。
optionexplicit
subfoo()
dimvar1
var1 = "yes"
msgbox "var1:"&var1&vbcrlf& "var2:"&var2
ifvar1 = "yes" then
dimvar2
var2 = "no"
endif
msgbox "var1:"&var1&vbcrlf& "var2:"&var2
Endingub
callfoo()
ASP開発では、関数を書くときの通常の練習は、使用されるまで変数を定義することです。変数の範囲は定義の位置とは何の関係もありませんが、変数を使用する前にそれを書く方が良いと思います。将来コードを変更する方が便利なので、変数定義を変更した後に変数定義を変更するために関数ヘッダーに目を向ける必要はありません。