2012-05-23 10 views
6

odio a abrir una nueva pregunta por una extensión a la anterior:Javascript retorno de la función recursiva

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; 
     } 
    } 
} 

esto devuelve iteración = 5, pero resultado no definido? Cómo es eso posible ? Devuelvo explícitamente sWord. Debería haber devuelto "hahalollollollollol" y solo para la verificación doble, si alerté (sWord) justo antes de la sword de retorno, se muestra correctamente.

Respuesta

14

Usted tiene que devolver todo el camino hasta la pila:

func2.call(this, sWord); 

debería ser:

return func2.call(this, sWord); 
0

Su función externa no tiene una declaración return, por lo que devuelve undefined.

4

necesita devolver el resultado de la recursividad, o de lo contrario el procedimiento vuelve implícitamente undefined. Pruebe lo siguiente:

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); 

debería ser

return func2.call(this, sWord); 
0

que sea sencillo :)

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; 
    } 
Cuestiones relacionadas