再帰的に間違えやすい点


「javascript高級プログラム設計」の第七章の再帰部分を見て、整理して糸口を整理します.
ここのエディタコードはあまり使いません.めちゃくちゃです.
いくつかの再帰においてエラーが発生しやすい点とエラー
1.関数名で自身を呼び出します.この関数が他の変数に割り当てられたとき、この関数がnullまたは他の非関数値に変わります.
たとえば
function factorial(num){     
if (num<=1) {          return 1;     }    
 else{          return num*factorial(num-1);     }
}
ここでは関数名factorialで自身を呼び出します.
使うなら
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4));//   !{{{(>_< )}}}
factoriaはもう一つの関数ではないですが、another Factorialを使う時に実行します.  return num*factoral(num-1)間違いを招く
ですから、argments.caleeを使って解決できます.
私たちはargments.caleeを復習します.
アーグメンントは、入力関数のすべてのパラメータを含むクラスの配列オブジェクトです.主な役割は関数パラメータを保存することです.
これはcaleeという属性を持ち、このargmentsオブジェクトを持つ関数を指すポインタです.
この再帰関数は他の名前に変えても呼び出されます.Θ )
2.ただし、厳密なモードでは、スクリプトを通してargments.caleeにアクセスできないため、エラーが発生します.
  したがって、ネーミング関数の表現を使用して行うことができます.
var factorial = (function f(num) {     
if (num<=1) {          return 1;     }     
else{          return num*f(num-1);     }
}
);
f()は内部関数ですので、外部令f=nullでも正常に動作します.