10 以内の階乗を試してみましょう:
外部 Js を導入する必要がある場合は、更新して実行する必要があります
]
再帰関数の呼び出しについてはここまでです。
JS の再帰関数が自分自身を呼び出すときの保険方法です。
JS 高度なプログラミングから
コードは次のとおりです:
関数 fat(num){
if (num<=1){
return 1;
}else{
return num*fact(num-1); 🎜> }
}
次のコードはエラーを引き起こす可能性があります。 //Error
fact は関数ではなくなったため、エラーが発生しました。
この問題は、実行される関数へのポインタである argument.callee で解決できます。
新しい関数は次のとおりです:
function fat(num ){
if (num<=1){
return 1;
}else{
return num*arguments.callee(num-1);
}
}
var anotherFact = fat;
fact = null;
alert(antherFact(4)); // 結果は 24 です。
JS での通常の再帰の改善
以下に示すように、関数が名前でそれ自体を呼び出すときに再帰関数が形成されます:
コードをコピーします
{
return 1;
}
else
{
return num *階乗(num-1)
}
}
Thisは古典的な階乗関数です。表面的には問題がないように見えますが、次のコードにより問題が発生する可能性があります。
var anotherFactorial = Factorial;
anotherFactorial(4); //出力 24
factorial = null
anotherFactorial (4); //TypeError: オブジェクトの 'factorial'; Window] は関数ではありません。chrome でテストします
その理由は、この時点で、anotherFactorial が定義されており、その関数を指しているため、anotherFactorial (4) を呼び出します。 24 を正常に出力できます。
このとき、factorial = null; の場合、実行定義関数の参照は anotherFactorial です。その場合、anotherFactorial(4) を呼び出すと、上記のエラー メッセージが表示されます。
現時点では、arguments.callee を使用して関数定義の階乗を置き換えることができます。
関数の定義は次のようになります。
コードをコピーします
{
return 1 ;
}
else
{
return num * argument.callee(num-1)
}
}
次に、上記の 4 つを使用します。テストコードの行数、テストコードの最後の行も正常に出力できます 24.
----------------------------- ----------- --
上記の内容は、<
> 第 2 版の 144 ページのセクション 7.1 からの抜粋です。