2016-07-08 10 views
4

Ich habe heute Morgen etwas merkwürdiges bemerkt, als ich versuchte, ein endloses Aufforderungssystem zu implementieren.Rekursive Eingabeaufforderung zurück undefined

Der folgende Code gibt 2 verschiedene Ausgänge unter 2 Szenarien:

Szenario 1: Nummer eingeben auf erster Eingabeaufforderung und ok

Ausgang 1:number that was entered


Scenario 2: Die erste Eingabeaufforderung abbrechen, dann die Nummer eingeben und OK

Ausgang 2:undefined


Ich bin ratlos, warum dies geschieht. Erstens, wie kommt das zurück undefiniert, wenn ich das in der if-Anweisung überprüfe? Zweitens hatte ich den Eindruck, dass in JavaScript undefined bedeutet, dass eine Variable deklariert wurde, aber noch nicht zugewiesen wurde. In diesem Fall weise ich die var number zu.

var number = null; 
 
number = Prompt(); 
 
$("p").html("Number was " + number); 
 

 
function Prompt() 
 
{ 
 
    var input = prompt("Enter a number", ""); 
 
    if(input === null || input === "" || input === undefined || isNaN(input)) 
 
     Prompt(); 
 
    else 
 
     return input; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 

 
<p></p>

Antwort

5

nur ein Codepfad einen Wert zurückgibt, ist es aus dem rekursiven Aufruf zurückkehren machen. In JavaScript, wenn eine Funktion endet ohne return-Anweisung seiner Rückkehr undefined

function Prompt() 
{ 
    var input = prompt("Enter a number", ""); 
    if(input === null || input === "" || input === undefined || isNaN(input)) 
     return Prompt(); 
    else 
     return input; 
} 
+0

Sie sollten erwähnen, dass nur eine Zeichenfolge von 'prompt' zurückgegeben. 'isNaN ('anystring')' gibt immer 'true' zurück, während' Number.isNaN' nur 'true' zurückgibt, wenn' input' tatsächlich 'NaN' ist. Empfehlen Sie 'parseInt' usw. – naomik

+0

@naomik: nicht wahr. 'isNaN (" ") === false" Ich weiß nicht, warum es falsch zurückgibt, aber vielleicht könntest du es versuchen "isNaN (parseFloat (input))' –

+0

@ThomasF danke, das wusste ich nicht, ich habe mich nur gestört daran zu erinnern, dass 'window.isNaN' ein Stück Müll ist. 'Number.isNaN' ist viel brauchbarer. – naomik

-1

ist, wenn die erste Eingabeaufforderung eine andere Prompt() Iteration abgebrochen wird aufgerufen, aber es ist Rückgabewert nicht überall erfasst wird. Die erste Iteration gibt dann den ursprünglichen undefinierten Rückgabewert zurück.

Musas Antwort zeigt eine Möglichkeit, dies zu beheben. Ein anderer wäre:

function Prompt() { 
    var input = null; 
    while(input === null) { 
     input = prompt("Enter a number", ""); 
    } 
    return input; 
} 
3

window.prompt immer gibt einen String oder null so nicht die Mühe für undefined prüft oder isNaN

Da auch window.prompt einen String zurückgibt, werden Sie window.parseInt, um verwenden müssen vertausche es zuverlässig in eine Nummer.

function Prompt() { 
 
    var n = window.parseInt(window.prompt("Enter a number"), 10) 
 

 
    if (Number.isNaN(n)) 
 
    return Prompt() 
 
    else 
 
    return n 
 
} 
 

 
alert("Your number is: " + Prompt())