電子書籍の厳選無料作品が豊富!

http://www.1art.jp/flash2/chapter/36/36.htm

http://oshige.com/flash/note/archives/2005/02/po …

などを参考に今、「配列」について勉強しています。
上記HPを見ていると、varが頻繁に出てきます。
とあるHPではvarの解説として「function内の変数に「var」をつけると、ローカル変数となり、functionの中だけで使える変数になる。functionを抜けると「var」のついた変数は無効となり、変数名が余計に増える事を防げる。」「よく分からなくても、functionの中だけで使い、functionを抜けるといらなくなる変数には、varをつけて定義すると覚えておけばよい」と書かれていてそういうものと思っていたのですが、そういうものでもないのかな??とvarって何? という感じでいます。

varとはどの様に使用すべきものなのでしょうか?
解説や参考HPなどありましたら書き込みをいただけたらと思います。
よろしくお願いします。

A 回答 (2件)

関数外で定義する変数に var を付けると、ActionScript 2.0 から採用された”変数の型の明示”を利用できるようになります。



例えば

 var a:String = "str";

このように” : ”に続けて現在定義されているクラス名を書くと、その変数が何のデータを持っているかを明示することができます。
var を付けずに

 a:String = "str";

と宣言すると、これはシンタックスエラーになります。

型の明示は String や Array に限らず、定義されているクラスであれば何でも構いません。
var が使える対象も同じです。


これだけですとあまりありがたみがないのですが、関数と一緒に使うと、関数が要求する型と呼び出す際の引数の型が一致しているかどうかを、コンパイル時にチェックしてくれるようになります。

(↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)


 /*数値を+1する関数*/
 function Calc( num:Number )
 {
  var calc_result:Number;


  calc_result = num + 1;

  trace( calc_result );
 }


 //変数を作って関数を呼び出す
 var a:String = "1";
 Calc( a );


↑この例では、関数 Calc は Number 型(いわゆる数値)を引数として受け取る設計になっています。
しかし、関数を呼び出す時に渡している変数 a は String 型(文字列)です。
従ってこの場合は、「パブリッシュ」または「ムービープレビュー」の際に「型が一致しない」とのエラーが報告されます。

***********************************

変数の型はC言語などのコンパイラではとてもうるさいのですが、ActionScript はかなりズボラです。
型の一致を厳しくチェックしてもらいたいのなら、変数と関数の仮引数部分の両方で型を明示しなければなりません。
型の明示は ActionScript 2.0 から採用されたものなので、2.0 でパブリッシュしてください。


例えば先の例で、

 a = "1";
 Calc( a );

このように変数 a の型を明示せずに宣言して関数に渡すと、Calc が要求する型と一致していなくてもエラーになりませんし、関数も実行されます。
ただし、実行結果が期待通りにはなりません。
Calc 関数は「渡されてきた”数値”に 1 加算する」という動作を期待して作ったものです。
ところが、実際に渡されてきたものは数値ではなく文字列だったために、数値の 2 にならず” 11 ”と文字列が連結されるという結果になります。


変数の方で型を明示しても、関数側で明示されていない場合も同様です。
関数 Calc の宣言部分が

 function Calc( num )

↑このように引数の型が明示されていなかったら、var と型の明示を使って宣言した変数 a を渡しても型のチェックが行われません。
渡されてきた a に入っているものが数値ならば問題はありませんが、文字列だった場合は文字列の演算として処理されてしまいます。

-----------------------------------------------------------------

関数内で var を付けて定義した変数はローカル変数といって、その関数の中だけで使える変数になります。
冒頭の例に出てきた関数 Calc 内にある変数 calc_result は、関数内で var を付けて宣言しているのでローカル変数です。

ローカル変数は関数実行時に作成され、関数が終了すると消えてしまいます。
ですから、calc_result を関数の外で利用しようとすると undefined (未定義)になります。

関数内でローカル変数を定義する var の使い方は、ActionScript 1.0 の頃( Flash Player 5 )からありました。


関数の外で定義する変数の場合は、型の明示と型の一致をチェックする機能を利用しないのなら var を付けてもあまり意味がありません。
つまり

 var a = "str";

のように、”変数の前に必ず var を付けるものだ”とおまじないとして使っているだけではダメです。

ご提示のページでも、var を使って宣言した変数には必ず型の明示も付いています。
変数の型と関数を宣言する時に引数の型を明示して初めて、関数外で使う var は真価を発揮するのです。


ちなみに、外部 as ファイルでクラスを定義する時、プロパティを宣言する場合は必ず var を付けなければならない決まりがあります。
    • good
    • 0
この回答へのお礼

ありがとうございました。

詳しく解説をいただき、大分理解できてきました。
ありがとうございました(^^).

お礼日時:2007/03/29 23:42

俺はActionScriptやJavascriptに慣れている人間ではないため,保証は出来ないが,その説明が正しいなら・・・



少し脱線して「名前空間」の話を見てもらうことにしよう
http://ja.wikipedia.org/wiki/%E5%90%8D%E5%89%8D% …

神奈川県の横浜市の山田家の一郎・・・A
神奈川県の横浜市の佐藤家の一郎・・・B
神奈川県の横浜市の市役所・・・C

AとBとの間の合意:
「市役所は神奈川県の横浜市の市役所だ」・・・山田家にとっても佐藤家にとっても「市役所」という同じ名称で通じる。・・・・グローバル変数

山田家(関数)
「一郎は神奈川県の横浜市の山田家の一郎だ」・・・山田家(スコープ)のローカル変数 「一郎」

佐藤家(関数)
「一郎は神奈川県の横浜市の佐藤家の一郎だ」・・・佐藤家(スコープ)のローカル変数 「一郎」

※本当はもうちょい複雑。グローバル変数には無名の名前空間とかの話が絡むと思うから・・・。メンバ変数とかのために「神奈川県」「横浜市」と長くしている
    • good
    • 0

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