サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

Arguments.callee

ID: FN0108010 Product: Flash

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日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.