Platform: All
Version: 5.0 and above
シンタックス
arguments.callee
説明
プロパティ; 現在呼出されているfunction(関数)自身を参照します[*1]。arguments.colleeプロパティを使うと、実行中のfunctionブロック{}内から、functionを指定することなく、そのfunction自身を再度呼び出すことができます。function中で自分自身を再度実行することを、「再帰呼出し」といいます。
[*1] データ型は、Functionです。したがって、Flash 8の「ActionScript 2.0リファレンスガイド」が「public callee : Object」とし、データ型をObjectのように記載しているのは誤りです。
|
例[*2]
つぎのサンプル(スクリプト001)は、function(関数)にプロパティを設定し、function内からその値を取出します。
スクリプト001■functionに設定されたプロパティを自身のブロック内から取出す
function myFunction():Void {
// function自身に設定されたプロパティを取出す
var name_str:String = arguments.callee._name;
trace(name_str);
}
// functionにプロパティを設定
myFunction._name = "myFunction";
myFunction(); // 出力: myFunction
|
以下の例(スクリプト002)は、再帰呼出しを用いて[*3]、整数の階乗を計算します。n!(nの階乗)は、nとnより小さなすべての正の整数との積になります。
スクリプト002■再帰呼出しを用いて整数の階乗を計算
// 階乗を計算する関数xFactorial
// [引数] n: 正の整数
function xFactorial(n:Number):Number {
if (n<=1) { //nが1以下であれば
//1を返す(再帰終了)
return 1;
} else { //nが1より大きければ
//nを1マイナスして関数の再帰呼び出し
return n*arguments.callee(--n);
// return n*xFactorial(--n); // 直接function名で参照も可能
}
}
// 関数のテスト例
trace (xFactorial(5)); //出力: 120 //= 5*4*3*2*1
|
なお、上記スクリプト002で実行中の関数を参照しているn*arguments.callee(--n)の式は、関数名を使ってn*xFactorial(--n)と書替えることができます(コメントアウトしたステートメント参照)。しかし、前者のプロパティを使用していれば、function名が変わっても、ステートメントを書替える必要はありません。
たとえば、引数に数値以外や負数、NaN(0/0などの場合)、あるいは少数値など、適切でない値が与えられた場合の処理を加えるとします。そのとき、最初に一度だけ実行すればよい不適切な引数の処理を、再帰呼び出しのたびに行うことは非効率といえます。したがって、呼出されたfunctionで引数の処理を行った後、別に定義したfunction内で再帰呼出しを行うとよいでしょう(スクリプト003)。
スクリプト003■引数の前処理をしたうえで整数の階乗を計算
// 階乗を計算する関数xFactorial
// [引数] n: 正の整数。それ以外の値は前処理される
// 実際には引数の前処理を行う
function xFactorial(n:Number):Number {
//不適切な引数の場合
if (typeof (n) != "number" || n<0 || isNaN(n)) {
return NaN; //エラーとしてNaNを返す
}
//小数点以下があれば切り捨て
n = Math.floor(n);
return _Factorial(n);
}
// 実際に階乗を計算する関数xFactorial
// [引数] n: 正の整数。それ以外の値は前処理される
function _Factorial(n:Number):Number {
if (n) { //nが0以外(より大)であれば
//nを1マイナスして関数の再帰呼び出し
return n*arguments.callee(--n);
} else { //nが0であれば
//1を返す(再帰終了)
return 1;
}
}
|
[*2] サンプルスクリプトは、ActionScript 2.0のシンタックスを用いています。ActionScript 1.0で使用する場合には、型指定を削除してください。
[*3] ActionScriptは256レベル以上の再帰を行うと、つぎのようなエラーになります。
1 つのアクション内で 256 レベルの反復を超えました。
無限ループの可能性があります。
このムービーではこれ以上のアクションの実行は無効になります。
|
|
Player
Flash 5以降。
関連項目
Arguments (オブジェクト)
_____
作成者: 野中文雄
更新日: 2006年1月13日 データ型についての注釈[*1]を追加
更新日: 2005年8月11日 MXから掲載されたためFlash 5で非ドキュメント化プロパティとの記載を削除。例を大幅に書替え。レイアウトその他を修正。
更新日: 2001年8月20日 匿名関数を使ってMathオブジェクトのメソッドを定義するスクリプトとその説明を追加
作成日: 2001年8月16日