javascript再帰関数問題

1786 ワード

最近は「Professional Javascript For Web Developers 3 rd Edition」を見ていますが、再帰関数の呼び出しに関する問題を見ました.ここでメモしておきます.
先に再帰関数を定義して、正の整数Nの階乗を求めます.
function factorial(num){
    if(num<=1)
        return 1;
    return num*factorial(num-1);
}
次に他の変数を指定してこの関数を指し、この関数をnullとします.
var anotherFactorial=factorial;
factorial=null;
alert(anotherFactorial(4));//  
なぜ間違えたというのですか?関数factoralの内部では、factoral自体が再帰的に呼び出されていますが、上のコードはfactoralをnullにしていますので、もう一つのfunctionではありません.これはちょっとおかしいと思いますが、javascriptの内部はこのように処理されています.この問題はどう解決しますか?一つの方法は関数の内部のargments.calleeで関数自体を置換することです.
function factorial(num){
    if(num<=1)
        return 1;
    return num * arguments.callee(num-1);
}
このように関数の値をどの変数に割り当てても、その後の呼び出しには問題がありません.したがって、再帰関数の内部では、関数自体の代わりにargments.calleeを使用することを提案する.あるいは関数式でこの問題を解決することもできます.
var factorial = (function f(num){
    if(num<=1)
        return 1;
    return num*f(num-1);
});
このように変数factorial変数の値を別の変数に割り当てるかどうかにかかわらず、再帰的に呼び出しても大丈夫です.