引数のデフォルト値
AS3 では関数宣言時に引数のデフォルト値を指定することができます。デフォルト値の無い引数と有る引数が存在する場合には、デフォルト値の無い引数を引数の列の最初にまとめます。デフォルト値として使用できる値は、コンパイル時に既知の定数のみです。
function sampFunc(x:int, y:int, z:int = 1) { // 呼び出し時に指定がなければ z の値は 1 になる } sampFunc(1, 0);
デフォルト値のある引数は呼び出し時に省略可能になります。通常は意識する必要のない引数に使用するとよいでしょう。
argument オブジェクト
デフォルト値の指定されていない引数を省略して関数を呼び出そうとするとコンパイラーがエラーを返します。また、宣言されているより多くの引数を指定して呼び出す場合もコンパイルエラーになります。ですが、どちらの場合も実行は許されます。(型の不一致は当然実行時エラーになりますが)
その際、引数にアクセスするためには arguments というオブジェクトを使用することができます。これは宣言無しで関数内で参照できるオブジェクトで、渡された引数の配列と呼び出し元のオブジェクト (arguments.callee) をプロパティとして持っています。ただし、引数名に arguments が使用されている関数内では arguments はその引数を指し、arguments オブジェクトは使用できなくなります。
arguments オブジェクトは以下のような再帰関数の実現に便利です。
var factirial:Function = function(x:int):int { if (x == 0) { return 1; } else { return (x * arguments.callee(x - 1)); } }
ところで、引数の数が不定の場合はコンパイルエラーを無視して関数を呼び出さなければならない、というのもちょっと気持ち悪いものです。そこで、AS3 には、arguments に代わる次のような機能が用意されています。
「...」 引数
AS3 では最後の引数として 「... + 任意の名前」 を指定すると、定義された数以上の引数を渡すことができるようになります。明示的に名前の指定されていない分の引数は、「任意の名前」で指定された名前を持つ配列として使用できます。下の例では、rest という配列に 2 と 3 が格納されます。
function sampFunc(x:int, ... rest) { if (rest.length > 0) { trace(rest[0]; } } // 2 が出力される sampFunc(1, 2, 3);
arguments オブジェクトと違って、この方法であればコンパイラーも文句を言いません。関数定義からも引数の数が不定であることが分かります。事前に引数の数が特定できない場合は 「...」 の使用をお勧めします。なお、「...」 が指定されていると arguments オブジェクトは使用できません。
コメントする