2012-05-23 25 views
6

Odio per aprire una nuova domanda per un'estensione alla precedente:javascript ritorno della funzione ricorsiva

function ctest() { 
    this.iteration = 0; 
    this.func1 = function() { 
     var result = func2.call(this, "haha"); 
     alert(this.iteration + ":" + result); 
    } 
    var func2 = function(sWord) { 
     this.iteration++; 
     sWord = sWord + "lol"; 
     if (this.iteration < 5) { 
      func2.call(this, sWord); 
     } else { 
      return sWord; 
     } 
    } 
} 

restituisce iterazione = 5 ma risultato indefinito? come è possibile ? restituisco esplicitamente sWord. Dovrebbe essere restituito "hahalollollollollol" e solo per doublecheck, se avviso (sWord) appena prima del ritorno sWord lo visualizza correttamente.

risposta

14

Bisogna restituire tutta la strada fino alla pila:

func2.call(this, sWord); 

dovrebbe essere:

return func2.call(this, sWord); 
0

La funzione esterna non ha un'istruzione return, quindi restituisce undefined.

4

è necessario restituire il risultato della ricorsione, altrimenti il ​​metodo restituisce implicitamente undefined. Provare quanto segue:

function ctest() { 
this.iteration = 0; 
    this.func1 = function() { 
    var result = func2.call(this, "haha"); 
    alert(this.iteration + ":" + result); 
    } 
    var func2 = function(sWord) { 
    this.iteration++; 
    sWord = sWord + "lol"; 
    if (this.iteration < 5) { 
     return func2.call(this, sWord); 
    } else { 
     return sWord; 
    } 
    } 
} 
1
func2.call(this, sWord); 

dovrebbe essere

return func2.call(this, sWord); 
0

mantenerlo semplice :)

your code modified in JSFiddle

iteration = 0; 
func1(); 

    function func1() { 
     var result = func2("haha"); 
     alert(iteration + ":" + result); 
    } 

    function func2 (sWord) { 
     iteration++; 

     sWord = sWord + "lol"; 
     if (iteration < 5) { 
      func2(sWord); 
     } else { 

      return sWord; 
     } 

    return sWord; 
    } 
Problemi correlati