【お題】引っかけ問題(締め切り10月27日(日)23時)

変数のスコープについて詳しく教えて下さい。

どこで宣言すれば、どこまで有効か知りたい。

条件分岐やループ、ファンクション等でのスコープが分かりません。

特に、ファンクションの中のファンクションとかです。

参考サイトやヒントだけでも良いので教えて下さい。

A 回答 (3件)

少し厳しいかもしれませんが、ご自分でサンプルコードを書いて実行してみましたか?


そういう経験の積み重ねが土台を作る一つの要因になるのだと私は思っています。
もしも検証できない状況にあるのでしたら、ごめんなさい。

かく言う私自身、VBScriptには明るくないので、正しいかどうかわかりませんが、
結論から言うと以下の通りかと思っています。

■結論
・グローバル領域(=いかなるプロシージャにも所属しない領域)で宣言された変数は、どこからでも参照可
・プロシージャ内(←ネストレベルは関係ない)で宣言された変数は当該プロシージャ内のみで有効
・プロシージャのネスト時に参照可能な変数は、グローバル変数と自プロシージャ内で宣言された変数のみ(=自分を呼び出した親プロシージャ内の変数を参照することはできない)
・プロシージャの引数がグローバル変数と同名の場合、引数が優先される
・条件分岐やループの内側か外側かは関係ない(内側で宣言した変数を外側で参照できる)
#プロシージャ≒「ファンクション」です。

■参考URL
http://www.google.com/search?q=vbscript+%E5%A4%8 …
http://www.keynus.co.jp/~uhara/html/vbscript/16. …

これで答えになっているでしょうか??
    • good
    • 1

VBScript の場合は、Sub プロシージャやFunction 関数、プロシージャの外で変数の宣言を行えば、グローバル・スコープになるし、各々のSub - End Sub や Function - End Functionの中で変数の宣言を行えば、その範囲のローカルのスコープになります。

これ自体は、VBなどと変わらないです。具体的な問題を抱えているなら、その例をあげていただいたほうが話が早いです。こういう総体的な話では、これだけの話にしかならないはずです。サブルーチンやFunction の引数の話はスコープとは別問題です。
    • good
    • 3

回答番号:No.1で回答した者です。


一応テストコードを載せておきますので試してみてください。
エラーになる箇所は適宜コメントアウトしてくださいね。

'------------------------------------------------------------
'テストコード
'------------------------------------------------------------

option explicit

'グローバルな領域で変数を宣言、値を代入します
dim hoge
hoge = "グローバル変数"
print(hoge)

'実行環境が不明なので出力の窓口を下記プロシージャで統一します
sub print(str)
wscript.echo str
'response.write str & "<br />"
end sub

'引数なしのsubプロシージャ
sub sub_without_arg()
print(hoge)
end sub

'グローバル変数と同名の引数をとるsubプロシージャ
sub sub_with_arg(hoge)
print(hoge)
end sub

'引数なしのfuncitonプロシージャ
function func_without_arg()
print(hoge)
end function

'グローバル変数と同名の引数をとるfuncitonプロシージャ
function func_with_arg(hoge)
print(hoge)
end function

'テスト実行
sub_without_arg()
sub_with_arg("subの引数")
func_without_arg()
func_with_arg("funcの引数")

'条件分岐の中で宣言した変数を条件分岐の外側から参照
if true then
dim hoge_if
hoge_if = "条件分岐の中で宣言した変数"
end if

print(hoge_if)

'ループの中で宣言した変数をループの外側から参照
do
dim hoge_loop
hoge_loop = "ループの中で宣言した変数"
loop while(false)

print(hoge_loop)

'「ファンクションの中のファンクション」確認用 外側
function outer_function()
dim fuga : fuga = "外側のプロシージャで宣言した変数"
inner_function()
end function

'「ファンクションの中のファンクション」確認用 内側
function inner_function()
print(fuga)
end function

'外側の変数を内側から参照できるか
outer_function()

'プロシージャ内で宣言した変数をグローバル領域から参照できるか
print(fuga)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報