再帰的に間違えやすい点
1129 ワード
「javascript高級プログラム設計」の第七章の再帰部分を見て、整理して糸口を整理します.
ここのエディタコードはあまり使いません.めちゃくちゃです.
いくつかの再帰においてエラーが発生しやすい点とエラー
1.関数名で自身を呼び出します.この関数が他の変数に割り当てられたとき、この関数がnullまたは他の非関数値に変わります.
たとえば
使うなら
ですから、argments.caleeを使って解決できます.
私たちはargments.caleeを復習します.
アーグメンントは、入力関数のすべてのパラメータを含むクラスの配列オブジェクトです.主な役割は関数パラメータを保存することです.
これはcaleeという属性を持ち、このargmentsオブジェクトを持つ関数を指すポインタです.
この再帰関数は他の名前に変えても呼び出されます.Θ )
2.ただし、厳密なモードでは、スクリプトを通してargments.caleeにアクセスできないため、エラーが発生します.
したがって、ネーミング関数の表現を使用して行うことができます.
ここのエディタコードはあまり使いません.めちゃくちゃです.
いくつかの再帰においてエラーが発生しやすい点とエラー
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でも正常に動作します.