• ベストアンサー

【VBScript】変数のスコープ

変数のスコープについて詳しく教えて下さい。 どこで宣言すれば、どこまで有効か知りたい。 条件分岐やループ、ファンクション等でのスコープが分かりません。 特に、ファンクションの中のファンクションとかです。 参考サイトやヒントだけでも良いので教えて下さい。

質問者が選んだベストアンサー

  • ベストアンサー
  • kobamotti
  • ベストアンサー率100% (3/3)
回答No.1

少し厳しいかもしれませんが、ご自分でサンプルコードを書いて実行してみましたか? そういう経験の積み重ねが土台を作る一つの要因になるのだと私は思っています。 もしも検証できない状況にあるのでしたら、ごめんなさい。 かく言う私自身、VBScriptには明るくないので、正しいかどうかわかりませんが、 結論から言うと以下の通りかと思っています。 ■結論 ・グローバル領域(=いかなるプロシージャにも所属しない領域)で宣言された変数は、どこからでも参照可 ・プロシージャ内(←ネストレベルは関係ない)で宣言された変数は当該プロシージャ内のみで有効 ・プロシージャのネスト時に参照可能な変数は、グローバル変数と自プロシージャ内で宣言された変数のみ(=自分を呼び出した親プロシージャ内の変数を参照することはできない) ・プロシージャの引数がグローバル変数と同名の場合、引数が優先される ・条件分岐やループの内側か外側かは関係ない(内側で宣言した変数を外側で参照できる) #プロシージャ≒「ファンクション」です。 ■参考URL http://www.google.com/search?q=vbscript+%E5%A4%89%E6%95%B0+%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97 http://www.keynus.co.jp/~uhara/html/vbscript/16.htm これで答えになっているでしょうか??

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

VBScript の場合は、Sub プロシージャやFunction 関数、プロシージャの外で変数の宣言を行えば、グローバル・スコープになるし、各々のSub - End Sub や Function - End Functionの中で変数の宣言を行えば、その範囲のローカルのスコープになります。これ自体は、VBなどと変わらないです。具体的な問題を抱えているなら、その例をあげていただいたほうが話が早いです。こういう総体的な話では、これだけの話にしかならないはずです。サブルーチンやFunction の引数の話はスコープとは別問題です。

全文を見る
すると、全ての回答が全文表示されます。
  • kobamotti
  • ベストアンサー率100% (3/3)
回答No.2

回答番号: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)

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Javascriptのスコープについて。

    私は何か大きな勘違いをしているでしょうか? for(var i=0; i<10; i++){ for(var i=0; i<10; i++){ alert(i); } } 単純なこのサンプルで、ループは総計100回回るはずだと思うのですが、 外側ループのローカル変数であるiが、なぜか内側ループのローカル変数iと同一視され、 結果10回しか回りません。 どこがおかしいでしょうか。 比較対象として、以下を実行しました。 var i=3; (function(){ var i = 2; alert(i); })(); alert(i); 結果は2, 3となりました。 スコープは機能しています。 前者はfor文だからおかしくなったのでしょうか? ・・・while文で書き下すと、あ、for文の()中で宣言するカウンタ変数というのは、該当for文のスコープの外に出ちゃっているんですね・・・。 つまり、for(var i・・・)と宣言したカウンタ変数のスコープは、for(){}のスコープではなく、その一個外に所属すると。。 こういう解釈でよいのでしょうか?よろしくお願い致します。m(_ _)m var i=0; while(i<10){ var i=0; while(i<10){ alert(i); i++; } i++; }

  • C#での変数スコープ?

    Net 2.0のC#で同一名の変数を使う場合について質問いたします。 以下のHoge1の場合には「 ローカルの変数 'x' をこのスコープで宣言することはできません。これは、'親またはカレント' スコープで別の意味を持つ 'x' の意味が変更されるのを避けるためです。」と怒られます。 一方、Hoge2の場合には怒られません。 Hoge2内でx=1;ではなくint x=1;と再宣言しているにもかかわらず怒られないのは、Hoge1が厳格にスコープ管理している点からみると意外に感じられます。 http://www.atmarkit.co.jp/ait/articles/0210/16/news001_5.html の記述を見ると、この記事が書かれた2002年ごろにはHoge2もNGだったような印象を受けるのですが、変化があったのでしょうか? この辺りの事情に詳しい方がおられましたらよろしく、お願い申し上げます。 class Class1 {    private void Hoge1()    {       int x;       {          int x = 2; // これはNG!。「ローカルの変数 'x' をこのスコープで宣言することはできません。これは、'親またはカレント' スコープで別の意味を持つ 'x' の意味が変更されるのを避けるためです。」と怒られる。       }    }    int x;    private static void Hoge2()    {       int x=1; //これはOK!親にぶらさげた変数が通る。    } }

  • javascriptのレキシカルスコープについて

    JSのレキシカルスコープがわかりません。 JSだと、一番外側のスコープで var str = "一番外側のスコープ"; とすると それ以降、ユーザー定義関数の中の、いわゆる関数スコープ内でも var str; と関数内で再定義しない限り、str = "一番外側のスコープ";を つかいまわすことになりますよね? 一度、関数内で、値を変更すると親スコープでもその変更が生きたままになると思います。 var str ="一番外側のスコープ"; function test(){ alert(str); str ="値の変更"; } alert(str) // 関数内で値をかえたけど、それが親スコープにも反映されてしまう。 このことがレキシカルスコープでしょうか? ただ、どこかのサイトで var num = 100; function makefunc() { return function() { alert(num); } } function callfunc() { var num = 50; var func = makefunc(); func(); }; callfunc(); でmakefunc()関数を呼び出した際の 関数内のnumという変数の値が100になるというのです。 実際、実行するとその通りなのですが、 var num = 50; という宣言は、callfunc() という関数の関数スコープ(ローカルスコープ) というのは理解しています。 でその中のいわゆる内部関数というのでしょうか? var func = makefunc(); func(); を実行した際の 変数numというスコープが 一番最初に宣言した  var num = 100; という値をさすというのです。(※そのサイトではこれをレキシカルスコープと呼んでいました) いったどういう動作がレキシカルスコープなのでしょうか? 他にも、クロージャともごっちゃになっております。 識者の方ご教授ください。 参考元はここです http://garden-place.jp/tech/javascript/scope-chain.html

  • 変数の宣言をグローバルにしないと変数の参照が出来ま

    変数の宣言をグローバルにしないと変数の参照が出来ません。 ソース全体はカプセル化のために即時関数で囲っています。 function found内で小数点第三位までで四捨五入するようにする処理が共通なので関数化したのですが、 var gramNumを外で宣言しないと参照できずにgramNumが定義されていないと出てしまい困りました 関数スコープの影響だと思い宣言を外に出したのですが、それでも定義されていないと出て、 最終的にグローバル変数にしてやっとうまくいきました。 スコープは自分より上のスコープの変数は参照できるようですが if(xGramEmptyFlag === true) {ないの式がroundの上にあるvar gramNumを参照する場合、 if分の中にある式の一つ上のスコープなので参照できると思ったのですがなぜできないのでしょうか? varはブロックスコープがないので一つ上ではなく同じスコープにあることになるのでしょうか? ただその場合も同じスコープの変数は参照できるのではないのでしょうか?

  • return の中はローカルスコープ?

    return 範囲内における、ローカル / グローバルスコープについて教えてください ■質問 ・returnするまではローカル変数? ・returnしたらグローバル変数? ・それとも、「return の中」というスコープは存在しない? ■例1 (function(){  return{   //ローカルスコープ?   //ここで定義した変数はローカル変数?  } })(); ■例2 (function(){  return{   hoge : (function(){    //ローカルスコープ?    //ここで定義した変数はローカル変数?   })()   }; })();

  • スコープ内の処理終了次第変数の中身が捨てられる

    スコープ内の処理終了次第変数の中身が捨てられるので、困ります。 フラグが使えません。 グローバルで宣言するとできるのですが、こんなに離れている管理しにくくないですか? もっと近くで残すことは仕様上できないのでしょうか? グローバル var emptyElement; これはずっと残っているグローバルは中身がスコープ内の処理が終わってもずっとリロードするまで残る仕様??? 即時関数内下   var emptyElement; クリック終了次第中にが捨てられる aaa.addEventListener('click', function() { emptyElement = true; } });

  • ファイル飛び越えてスコープは不可能ですか?

    aaa.accdbとbbb.accdbがあり bbb.accdbに変数の宣言と言うモジュールを作り、 aaa.accdbから bbb.accdbへ変数の宣言を参照することは可能ですか? publicで宣言をしても ファイル飛び越えてスコープは不可能ですか?

  • phpでの局所変数

    phpで、perlでいうlocalやmyのような宣言はできないのでしょうか? function a() {  if(1){   $a=2;   print "$a<br>";  }  print "$a<br>"; } としても2が2つ表示されてしまいます。 ある関数内で場所を問わず宣言したグローバル変数でない変数のスコープは、宣言場所がどこであれ、「関数内」となるのでしょうか?

    • ベストアンサー
    • PHP
  • エクセルVBAでの変数のスコープ

    基本的なことなのですが、教えて下さい。 当方、PHPやjavascriptを中心にプログラムしてきたのですが、 今回、エクセル+VBAでプログラムすることになり、VBAを勉強しているところなのですが、ちょっと戸惑っています。 いままでは、グローバル変数をなるべく使わないように、プログラミングをしてきたのですが、 VBAの勉強で、参考にしている本のコードは、全てグローバル変数を使っています。 そもそも、エクセルのシート・セルがグローバル変数のようなもの(?)なので、変数のスコープにこだわってもあまり意味がないのかな?とも思います。 エクセル+VBAである程度の規模のプログラムを作る際、 変数のスコープはどのように使い分けるのが良いのでしょうか? すみませんが、ご教授の程、よろしくお願いします。

  • スコープについて

     PHPの変数スコープでは、global変数をglobalキーワードを使って、localに持ち込むことや、$GLOBALSを利用して呼び込むことができますが、local変数を関数の外(つまりglobal変数として)に持ち出すにはどうしたらよいのでしょうか? <? function example() { //なんらかの処理 $flag = 1; //なんらかの処理 } echo $flag; ?> これだと駄目なんですよね? returnで返す値にはその他のものが入っていて、一部のローカル変数のみを一時的にグローバル化したい…と思っています。  よろしくお願いします。

    • ベストアンサー
    • PHP