JSでは、他の関数が関数で呼び出される状況に遭遇することがよくあります。現時点では、fn()のようなコールメソッドがあり、もう1つはreturn fn()のようなコールメソッドです。一部の初心者は、これら2つの方法でしばしば混乱しています。ここでは、エレガントなインタビューの質問を使用して、2つの方法の違いを分析します。
var i = 0; function fn(){i ++; if(i <10){fn(); } else {return i; }} var result = fn(); console.log(result);これは、隠された落とし穴に関するインタビューの質問です。とても簡単に思えます。ほとんどの人は、考えずに10に答えることができます。実際、印刷されているものが未定義であることがわかります。このトラップの質問は、上記の問題を直感的に反映しています。 FNを実行する行を変更するとき:
var i = 0; function fn(){i ++; if(i <10){return fn(); } else {return i; }} var result = fn(); console.log(result);この時点で、印刷された結果は10であることがわかります。
ここにリターンを追加するか追加しないかに大きな違いがあるのはなぜですか?
ここでの主な理由は非常に簡単です。 JavaScript関数にはデフォルトの返品値があります。関数が最後に返されない場合、未定義はデフォルトで返されます。これが、Chromeコンソールでコードを作成するときに、未定義の行が以下に頻繁に表示される理由です。
この例を詳しく見てみましょう。私が9に増加すると、FNが最後から2番目に再帰的に呼ばれるのは2度目です。返品がない場合、今回FNが実行された後、デフォルトでは未定義で返され、次の再帰は継続しません。返品が追加されると、最後の再帰はここで続きます。つまり、i = 10の場合、Elseにジャンプして正しい10を取得するために戻ります。
これについて言えば、より古典的な例、有名なバイナリ検索方法を拡張できます。
var mid = math.floor((arr.length -1) / 2); function search(n、mid){if(n> arr [mid]){mid = math.floor((mid + arr.length) / 2); return search(n、mid); } else if(n <arr [mid]){mid = math.floor((mid -1) / 2); return search(n、mid); } else {return mid; }} var index = search(n、mid); console.log(index);バイナリ検索方法には、複数の再帰呼び出しも必要です。多くの初心者は、このアルゴリズムを初めて実装するときにしばしば間違いを犯します。再帰関数の前にリターンを追加するのを忘れることであり、最終的にはリターン結果が未定義になります。ここでの理由は、前のものに似ています。返品を追加しないと、再帰の直後に未定義に戻り、次の再帰を続けることはありません。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。