2016-09-29 8 views
0

undefiniert Zurückgeben I haben folgende Funktion auf JSFiddle:Javascript rekursive Funktion anstelle des erwarteten Ergebnisses

function getRandomPointsInRange(range){ 

     var x1 = rand(1, 40), 
      y1 = rand(1, 40), 
      x2 = rand(1, 40), 
      y2 = rand(1, 40), 
      result; 

     if(getDistance(x1, y1, x2, y2) < range){ 
      console.log('test'); 
      getRandomPointsInRange(range); 
     }else{ 

      result = {x1: x1, y1: y1, x2: x2, y2: y2}; 
      console.log(result); 
      return result; 
     } 
    } 

Er erzeugt zwei Punkte mit Abstand gleich oder größer zu bestimmten Abstand (20 in diesem Fall). Problem ist, dass die Funktion manchmal undefined zurückgibt, anstatt das erwartete Ergebnis. Sie können dies nicht in JS Fiddle sehen, aber das Konsolenprotokoll zeigt, dass die Funktion undefined nur zurückgibt, wenn die Funktion sich mindestens einmal aufruft (wenn console.log('test') ausgelöst wird. Selbst wenn die Funktion undefined zurückgibt, wird das Ergebnis selbst als Objekt definiert (zweite Konsole). Protokoll zeigt richtige Objekt mit Punkten Koordinaten) Warum ist das passiert und wie diese behoben werden können, so richtige Objekt würde immer zurückgegeben werden

JS Fiddle Link:.?. https://jsfiddle.net/3naLztoa/2/

+0

Antworten zu finden, war so einfach wie Wörter aus Titel Googeln: [site: stackoverflow.com javascript recursive function gibt undefined zurück] (https://www.google.com/search?q=site%3Astackoverflow.com+javascript+recursive+function+returns+undefined) –

Antwort

2

Prima vista, müssen Sie eine andere return

Grundsätzlich rekursive Funktionen müssen an jedem Ausgang einen Wert, wenn die Funktion sollte r einen Wert eingeben. Wenn Sie keinen angeben, erhalten Sie nach Entwurf undefined.

Um dies zu verhindern, müssen Sie den Wert eines anderen Aufrufs einer rekursiven Funktion zurückgeben.

function getRandomPointsInRange(range) { 
    var x1 = rand(1, 40), 
     y1 = rand(1, 40), 
     x2 = rand(1, 40), 
     y2 = rand(1, 40), 
     result; 

    if (getDistance(x1, y1, x2, y2) < range) { 
     console.log('test'); 
     return getRandomPointsInRange(range); 
     // ^^^^ 
    } else { 
     result = {x1: x1, y1: y1, x2: x2, y2: y2}; 
     console.log(result); 
     return result; 
    } 
} 
0

@Nina sagt, müssen Sie eine andere return und JSON.stringify json drucken das Ergebnis zeigen:

function getDistance(x1, y1, x2, y2) { 
 

 
    var result = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); 
 
    return result; 
 
}; 
 

 
function rand(min, max) { 
 
    return Math.floor(Math.random() * (max - min + 1)) + min; 
 
}; 
 

 
function getRandomPointsInRange(range){ 
 
\t \t 
 
\t \t var x1 = rand(1, 40), 
 
\t \t \t y1 = rand(1, 40), 
 
\t \t \t x2 = rand(1, 40), 
 
\t \t \t y2 = rand(1, 40), 
 
\t \t \t result; 
 
\t \t \t 
 
\t \t if(getDistance(x1, y1, x2, y2) < range){ 
 
\t \t \t return getRandomPointsInRange(range); 
 
\t \t }else{ \t \t \t 
 
\t \t \t result = {x1: x1, y1: y1, x2: x2, y2: y2}; 
 
\t \t \t return result; 
 
\t \t } 
 
\t } 
 
    document.getElementById('result').innerHTML = JSON.stringify(getRandomPointsInRange(20));
<body> 
 
    <p id="result"> 
 

 
    </p> 
 
</body>

Verwandte Themen