変数の種類とスコープ(有効範囲)
変数にはタイムライン変数、ローカル変数、グローバル変数の3種類があります。さらに、ActionScript2.0以降の外部スクリプトで定義されたクラスでは、パブリック変数、プライベート変数、スタティック変数という3種類の変数を使い分けることができます。
変数の種類の違いはスコープの違い、すなわち、変数の有効範囲の違いと言えます。たとえば、フレームアクションにある変数aとムービークリップアクションにある変数aは名前が同じでも別の変数であるというようなぐあいです。また、変数の値がどの範囲で保持されるかというという問題もあります。
note:テキストフィールドを変数として使うこともできますが、これはFlash 5以前との互換性を保つための機能です。
■タイムライン変数
フレームアクションに直接書いた変数は、そのタイムラインの中で有効な変数です。直接書いた変数とは、たとえば次のようなフレームアクションを言います。タイムライン変数の宣言にはvarステートメントを付けますが、これは省略も可能です。
フレームアクション:フレーム1
var a = 15;
var b = 32;
var x = a + b;
trace("x=" + x); //出力→ x=47
フレームアクションは、フレームアクションが設定してあるキーフレームが再生されたときに実行されます。したがって、まだ再生していないキーフレームのフレームアクションに書いてあるタイムライン変数にはアクセスできません。そのキーフレームが1度でも再生されたならば、そこに書いてあるタイムライン変数にアクセスできるようになります。
たとえば、フレーム1に次のフレームアクションを書きます。
フレームアクション:フレーム1
trace("c=" + c);
次にフレーム10をキーフレームを挿入し、次のフレームアクションを書きます。
フレームアクション:フレーム10
var c = 555;
this.gotoAndPlay(1);
このムービーをパブリッシュするとフレーム1のフレームアクションが実行され、変数cの値を出力パネルに書き出します。結果はundefined(未定義)になります。
ムービーは再生を続けてフレーム10を再生し、フレーム10のフレームアクションを実行して再びフレーム1に戻ります。フレーム1に戻るともう1度フレーム1のフレームアクションが実行されて変数cの値を出力パネルに書き出します。すると今度は変数cに555が入っているのがわかります。これが繰り返されるので出力パネルは次のようになります。このことから、同じタイムラインで同名のタイムライン変数が使用されている場合には、後から実行されたフレームアクションによって変数の値が更新されることになります。
出力パネルの結果:
c=undefined ←1回目の出力時には値は未定義。
c=555 ←フレーム10を実行したときに値が入った。
c=555
...(以下、c=555が繰り返す)
ほかのムービークリップのタイムライン変数を参照することもできます。その場合にはインスタンスのプロパティを参照する場合と同じようにドット演算子(.)または配列演算子([])を使って参照します。たとえば、my_mcのタイムラインで使われているタイムライン変数vには次の式で参照できます。どちらも変数vに31を入れます。
例:
_root.my_mc.v = 31;
_root.my_mc["v"] = 31;
逆にほかのムービークリップのタイムラインからメインのタイムラインの変数にアクセスするといった場合には_rootを使います。
例:
_root.w = 123
_root["w"] = 123
note:
タイムライン変数はインスタンスのプロパティという解釈もできます。メインのタイムラインならば、_rootのプロパティという位置付けです。
■ローカル変数
ローカル変数は、関数やメソッドを定義するfunctionステートメントのブロック内で宣言し、その中でのみ有効な変数です。functionブロックをいったん離れると変数は破棄され、変数の値は保持されません。たとえるなら、1度退場すると無効になる入場券のようなものです。
ローカル変数はvarステートメントで宣言しなければなりません。次のkakezan関数では、ローカル変数vを掛け算の結果を入れる変数として利用しています。
また、関数やメソッドでは引数を受け渡す際にローカル変数が使われます。これをパラメータ変数と呼ぶことがあります。例で使用している変数a、変数bがパラメータ変数です。パラメータ変数はvar宣言が不要です。
//kakezan関数の定義
function kakezan(a, b) {
var v = a * b;
return v;
}
では、次のようなフレームアクションを考えて見ましょう。1行目で変数vに7を入れた後で、kakezan(3, 5)を実行します。変数vの値とkakezan(3, 5)の結果をtraceで出力して調べます。
sample → kakezan.fla
フレームアクション:
var v = 7;
var ans = this.kakezan(3, 5);
trace("ans=" + ans);
trace("v=" + v);
//kakezan関数の定義
function kakezan(a, b) {
var v = a * b;
return v;
}
図3-3-2 フレームアクション
kakezan(3, 5)を実行するとkakezan関数の中の変数vは15になります。しかし、trace("v" + v)で出力される値は1行目で変数vに入れた7になります。つまり、kakezan関数の中のローカル変数vはタイムライン変数vの値を書き換えなかったということです。
出力パネルの結果:
ans=15
v=7
この例において、functionブロック内で変数vをvarステートメントで宣言せずに使うと変数vはタイムライン変数になってしまい、1行目の変数vの値を上書きしてしまいます。結果として、出力パネルにはどちらの値も15で書き出されます。
このことから、functionブロック内の変数をvarでローカル変数宣言するのとしないとでは、大きな違いがあることがわかります。
//kakezan関数の定義
function kakezan(a, b) {
v = a * b; // varを付けない
return v;
}
出力パネルの結果:varを付けなかった場合。変数vは上書きされている。
ans=15
v=15
■グローバル変数
グローバル変数は_grobalオブジェクトを利用して作る変数で、ムービーを通してどこからでもアクセスできる変数です。たとえば、グローバル変数myVを使うには次のように書きます。_grobalオブジェクトのインスタンスを作る必要はありません。
例:
_global.myV = 123; //値を代入
++_global.myV; //カウントアップ
次のように配列やArrayオブジェクトを利用するとグローバル変数の管理が簡素化されます。(配列→p.??、Arrayオブジェクト→p.??)
例:
_global.colors = ["red", "green", "blue"];
_global.usrpref = {#name:"美幸", #age:29};
値を取り出すには次のように参照します。配列は要素の並びを0から数えるので、colors[1]は2番目の要素、つまり"green"を指します。
例
var myColor = _global.colors[1]; // "green"
var usrName = _global.usrpref.name;
var usrAge = _global.usrpref["age"];
■テキストフィールドを使った変数
テキストフィールドをダイナミックテキストまたはテキスト入力の設定にすると変数名を入力する項目が追加されます。ここに変数名を入れれば、テキストフィールドを変数のように使うことができます。変数の値はテキストフィールドに入って表示されます。値の取り出し方も同じで、テキストフィールドに表示されているデータを変数名で取り出せます。変数名を宣言する必要はありません。
たとえば、テキストフィールドにtheDataという変数名を付けたならば、次のように参照できます。
例:
theData = "これはテキストフィールドのデータです。";
var msg = theData; //変数msgに入れる
図3-3-3 テキストフィールドに変数名を付ける
note:
変数名の入力フィールドはパネルの情報領域を展開して広げないと表示されません。
ただ、テキストフィールドを変数に利用する方法は以前のバージョンのFlashの仕様を残しているだけのものといえます。テキストフィールドに値を入れたり取り出すというだけの目的ならば、テキストフィールドのtextプロパティを利用できます。この場合は、テキストフィールドに変数名を付けるのではなくインスタンス名を付けます。たとえば、インスタンス名をdata_txtと付けたならば次のように参照します。
例:
data_txt.text = "これはテキストフィールドのデータです。";
var msg = data_txt.text; //変数msgに入れる
図3-3-4 テキストフィールドにインスタンス名を付ける
投稿者 oshige : 2005年2月14日 12:30