変数

変数を使用すると、プログラムで使用する値を格納できます。変数を宣言するには、変数名を使用した var ステートメントを使用する必要があります。ActionScript 2.0 では、型注釈を使用する場合にのみ var ステートメントを使用する必要があります。ActionScript 3.0 では、常に var ステートメントを使用する必要があります。たとえば、ActionScript の次の行は、i という名前の変数を宣言します。

var i;

変数を宣言するときに var ステートメントを省略すると、strict モードではコンパイルエラーが発生し、standard モードではランタイムエラーが発生します。たとえば、次のコード行は、変数 i があらかじめ定義されていない場合はエラーになります。

i; // i があらかじめ定義されていない場合はエラー

変数をデータ型に関連付ける場合は、変数を宣言するときに行います。変数の型を指定しないで変数を宣言することができますが、strict モードではコンパイラ警告が生成されます。変数の型を指定するには、変数の名前にコロン (:) と変数の型を追加します。たとえば、次のコードは int 型の変数 i を宣言します。

var i:int;

代入演算子 (=) を使用して、変数に値を割り当てることができます。たとえば、次のコードは、変数 i を宣言し、その変数に値 20 を割り当てます。

var i:int;
i = 20;

次の例に示すように、変数を宣言するときに同時に変数を割り当てる方が便利です。

var i:int = 20;

変数を宣言するときに変数に値を割り当てる手法は、整数やストリングなどのプリミティブな値を割り当てる場合だけではなく、配列を作成する場合やクラスのインスタンスをインスタンス化する場合にもよく使用されています。次の例は、コードを 1 行使用して宣言され、値が割り当てられる配列を示します。

var numArray:Array = ["zero", "one", "two"];

new 演算子を使用して、クラスのインスタンスを作成することができます。次の例では、CustomClass というクラスのインスタンスを作成し、新しく作成されたクラスインスタンスへの参照を customItem という変数に割り当てます。

var customItem:CustomClass = new CustomClass();

複数の変数を宣言する場合は、カンマ演算子 (,) を使用して変数を区切り、1 行のコードですべての変数を宣言することができます。たとえば、次のコードは、コード 1 行で 3 つの変数を宣言します。

var a:int, b:int, c:int;

同じコード行で、各変数に値を割り当てることもできます。たとえば、次のコードは、3 つの変数 (ab、および c) を宣言し、各変数に値を割り当てます。

var a:int = 10, b:int = 20, c:int = 30;

カンマ演算子を使用して変数宣言を 1 つのステートメントにグループ化できますが、コードの可読性が低下する可能性があります。

サブトピック

変数のスコープについて
デフォルト値

変数のスコープについて

変数の "スコープ" とは、レキシカル参照によって変数にアクセスできるコードの範囲です。"グローバル" 変数は、コードのすべての範囲で定義される変数で、"ローカル" 変数は、コードの一部分でのみ定義される変数です。ActionScript 3.0 では、変数には、常にその変数が宣言された関数またはクラスのスコープが割り当てられます。グローバル変数は、関数またはクラスの定義の外部で定義する変数です。たとえば、次のコードは、関数の外部で宣言して、グローバル変数 strGlobal を作成します。この例では、グローバル変数は関数定義の内部および外部の両方で利用できることを示します。

var strGlobal:String = "Global";
function scopeTest()
{
    trace(strGlobal); // グローバル
}
scopeTest();
trace(strGlobal); // グローバル

ローカル変数を宣言するには、関数定義内で変数を宣言します。ローカル変数を定義できるコードの最小範囲が関数定義です。関数内で宣言されたローカル変数は、その関数内でのみ存在します。たとえば、変数 str2 を関数 localScope() の中で宣言すると、この変数は関数の外部では利用できません。

function localScope()
{
    var strLocal:String = "local";
}
localScope();
trace(strLocal); // strLocal がグローバルに定義されていないことによるエラー

ローカル変数に使用した変数名がグローバル変数として宣言されている場合、ローカル変数がスコープ内にある間は、ローカル定義がグローバル定義を非表示に (シャドウ) します。ただし、グローバル変数は関数の外でも存在しています。たとえば、次のコードは、グローバルストリング変数 str1 を作成した後、同じ名前のローカル変数を scopeTest() 関数内に作成します。関数内の trace ステートメントはこの変数のローカル値を出力しますが、関数の外にある trace ステートメントはこの変数のグローバル値を出力します。

var str1:String = "Global";
function scopeTest ()
{
    var str1:String = "Local";
    trace(str1); // ローカル
}
scopeTest();
trace(str1); // グローバル

C++ や Java の変数とは異なり、ActionScript の変数にはブロックレベルのスコープはありません。コードブロックは、左中括弧 ({) と右中括弧 (}) で囲まれたステートメントのグループです。C++ や Java などのプログラミング言語では、コードブロック内で宣言された変数は、コードブロック外では利用できません。このスコープ制限はブロックレベルのスコープと呼ばれますが、ActionScript にはありません。コードブロック内で変数を宣言すると、変数はそのコードブロック内だけではなく、コードブロックが属する関数の他の部分でも利用できます。たとえば、次の関数にはさまざまなブロックスコープで定義された変数が含まれています。すべての変数を関数全体で利用できます。

function blockTest (testArray:Array)
{
    var numElements:int = testArray.length;
    if (numElements > 0)
    {
        var elemStr:String = "Element #";
        for (var i:int = 0; i < numElements; i++)
        {
            var valueStr:String = i + ": " + testArray[i];
            trace(elemStr + valueStr);
        }
        trace(elemStr, valueStr, i);   // すべて定義済みのまま
    }
    trace(elemStr, valueStr, i); // numElements > 0 の場合、すべて定義済み
}

blockTest(["Earth", "Moon", "Sun"]);

ブロックレベルのスコープが存在しないので、関数が終了する前に宣言されている限り、変数を宣言する前に読み込んだり、変数に書き込んだりできます。これは、"ホイスト" と呼ばれる手法によるもので、コンパイラによりすべての変数宣言が関数の最上位に移動されます。たとえば、num 変数が宣言される前に num 変数の初期 trace() 関数が実行される場合でも、次のコードはコンパイルされます。

trace(num); // NaN
var num:Number = 10;
trace(num); // 10

しかし、コンパイラは代入ステートメントをホイストしません。このため、num の初期の trace() は数値データ型の変数のデフォルト値である NaN (非数) になります。つまり、次の例に示すように、変数が宣言される前でも変数に値を割り当てることができます。

num = 5;
trace(num); // 5
var num:Number = 10;
trace(num); // 10

デフォルト値

"デフォルト値" とは、値を設定する前に変数に格納されている値です。変数に初めて値を設定する場合は、変数を "初期化" します。変数を宣言して、値を設定しない場合、その変数は初期化されません。初期化されていない変数の値は、そのデータ型によって異なります。次の表は、変数のデフォルト値をデータ型に整理して示します。

データ型

デフォルト値

Boolean

false

int

0

Number

NaN

Object

null

String

null

uint

0

宣言されていない (型注釈 * と同じ)

undefined

ユーザー定義クラスを含むその他すべてのクラス

null

Number 型の変数の場合、デフォルト値は NaN (非数) です。これは、IEEE-754 規格で定義されている特別な値で、数値を表さない値です。

変数を宣言して、そのデータ型を宣言しない場合、デフォルトのデータ型 * が適用されます。これは、変数の型指定がないことを示します。型指定されていない変数を値で初期化しない場合も、デフォルト値は undefined です。

Boolean、Number、int、および uint 以外のデータ型の場合、初期化されていない変数のデフォルト値は null です。これは、Flash Player API で定義されたすべてのクラスおよび作成したカスタムクラスに適用されます。

null は、Boolean、Number、int、および uint 型の変数では有効な値ではありません。値 null をこれらの変数に割り当てようとすると、この値はそのデータ型のデフォルト値に変換されます。Object 型の変数の場合、値 null を割り当てることができます。値 undefined を Object 型の変数に割り当てようとすると、この値は null に変換されます。

Number 型の変数では、変数が数値でない場合にブール値 true を返し、そうでない場合に false を返す isNaN() という名前の特殊なトップレベル関数があります。


 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート

現在のページ: http://livedocs.adobe.com/flash/9.0_jp/main/00000043.html