JavaScript Diary

無名関数の再帰 [ 2001/09/22 ]
関数内で arguments.callee の値を調べるとその関数が入っていることが分かります。 使用例としては階乗を求める再帰関数を用いたプログラム↓
function factrial( n ){
    if( n <= 0 ){
        return 1 ;
    }else{
        return n*factrial( n-1 );
    }
}
これは何の変哲もないプログラムですが、arguments.callee を使うと
function factrial( n ){
    if( n <= 0 ){
        return 1 ;
    }else{
        return n*arguments.callee( n-1 );
    }
}
と書けます。これだけでも「おっ、コイツやるな」と思わせるには十分なのですが、実際には以下のような使い方をすることが多いです。
function createFunction( n ){
    return function( i ){
        if( i > 0 ){
            return Math.pow( i, n )+arguments.callee( i-1 );
        }else{
            return 0 ;
        }
    }
}

var sum2 = createFunction( 2 );
var sum4 = createFunction( 4 );

alert( sum2( 5 ) ); // 結果は 55 = 1^2+2^2+3^2+4^2+5^2 = 1+4+9+16+25
alert( sum4( 3 ) ); // 結果は 98 = 1^4+2^4+3^4 = 1+16+81
callee プロパティはこのように無名関数を再帰するときに効果を発揮します。
また、callee プロパティを使用すると今までは実現不可能だったプログラムをいとも簡単に作成できたりします。色々自分で試してみて下さい。

ところで↑のプログラムすさまじいスコープ(クロージャ)になっているの分かりますか?
このぐらいになると初心者が理解することは先ず無理でしょうね。