2016-10-25 2 views
0

私のプログラミング "スキル"の基礎は揺れています。この動作が再帰、閉鎖などによって引き起こされるかどうかはわかりませんが、これははるかに奇妙です私は今まで見たことがあります。閉鎖を伴う再帰関数の復帰動作

元の意図は、再帰を使用してdom要素の親を数えたことです。クロージャは、私のカウンタを格納するために実装されており、再帰はdiv#ラッパーと等しくないすべての親に対してそれを増やします。それは一度動作します。最初の要素(親が1つしかない - それは1を返します)しかし、2回目はそれがundefinedを返します。テストのために私は、このリグを思い付いた:私は実際に私の目を問うています

let parents = countParents(); 
let pathLength = parents(3); 

function countParents() { 
    let counter = 0; 
    return function nextParent(node) { 
     let parent = node - 1; 
     counter++; 
     if (parent === 1) 
      return 'WATAFAK'; 
     else 
      nextParent(parent); 
    } 
} 

console.log(pathLength); 

(それが遅く、今しばらくの間、プログラミングされています)が、この機能はundefinedを返します。そんなことがあるものか?

+0

'else'ブランチにreturn文がありません。 – user2357112

+1

また、あなたが働いている言語で質問にタグを付けてください。 – user2357112

答えて

1
function countParents() { 
    let counter = 0; 
    return function nextParent(node) { 
     let parent = node - 1; 
     counter++; 
     if (parent === 1) 
      return 'WATAFAK'; 
     else 
      nextParent(parent); // call nextParent(parent) and throw away result 
     return undefined;  // invisible line in every function 
    } 

    return undefined;   // invisible line in every function (never reached) 
} 

再帰結果を結果にする場合は、その前にreturnを追加する必要があります。今はどのように副作用のためだけで、かなり多くのデッドコードです。

ブランチが返されないため、すべての関数はブロックが終了する直前に表示されないreturn undefined,を持っています。

+0

しかし、親が1になると、それはなぜ戻りませんか?いったんこの条件が評価されると、再帰かどうかは関係ありません。指定された値を返します。この場合、ハードコーディングされた 'WATAFAK'です。私は実際には(デバッグ中に)条件が満たされたときにリターンラインでブレークすることを見ることができます。 – Alex

+1

@Alexそれがあります。それは、**返さない**と同じ関数のインスタンスになることができる呼び出し先に戻ります。 'return'は束全体の返り値ではなく、ただ一つ返します。関数内に複数の 'console.log( 'test')があるとします。戻り値が呼び出し先を終了させた場合は、 'console.log'が返ってくるので出力が1つしか表示されず、あなたのロジックに応じてそれを呼び出す関数も返されます。あなたが望むものを得るためには、デフォルトのケースを 'return nextParent(parent);に変更する必要があります。そうすれば' nextParent(parent) 'の結果が返されます。 – Sylwester

+0

再帰的な振る舞いがその背後にある理由です。これで、if条件が満たされたときに 'WATAFAK'を返しますが、このインスタンスはnextParentの前のインスタンスに戻ります。私は特に指定していないからです。ありがとう男:) – Alex