無名関数への参照(arguments.callee)

addEventListenerとかで無名関数を使用するときに、そのリスナー自身の参照を外すにはarguments.calleeを使えば関数の内部から参照を外せます。

例えば、フレーム数をカウントするためにENTER_FRAMEイベントを登録、無名関数で処理をしてカウントが100になったらENTER_FRAMEを停止してみる。

var count:int = 0;

this.addEventListener(Event.ENTER_FRAME,function():void
{
  count++;
  if(count == 100) this.removeEventListener(Event.ENTER_FRAME,arguments.callee);
}
);

arguments.calleeは実行中の関数(無名関数)を参照しているので、「thisに登録された[無名関数]への参照を外す」ということになる。

arguments.calleeは無名関数の再帰呼び出しにも利用することができる。上記と同じ例で、ENTER_FRAMEを使用しないでやってみる。(イベントを発生させるために一応CLICKで)

var count:int = 0;

stage.addEventListener(MouseEvent.CLICK,function():void
{
    count++;
    if(count == 100)  stage.removeEventListener(MouseEvent.CLICK,arguments.callee);
    else arguments.callee(); //再帰
}
);

考えてみたら、ENTER_FRAMEと再帰は一緒なはずないですよね。再帰の例はfor文と同じです。回数以外の条件が満たされたときにループから抜ける時に再帰かな?そのへんまだまだ勉強不足。

The URL to TrackBack this entry is:

コメントをどうぞ