2016-07-08 23 views
4

私は無限のプロンプトシステムを実装しようとしていた今朝、かなり奇妙なことに気付きました。再帰的プロンプトが返されない

次のコードは2つのシナリオの下で2つの異なる出力を返す:

シナリオ1: 1最初のプロンプトに番号を入力し、OK

出力:number that was entered


シナリオ2:最初のプロンプトをキャンセルしてから番号とOKを入力してください

出力2:undefined


私はこれが起こっている理由として困惑です。まず、if文でそれをチェックしているとき、これはどのようにして未定義に戻りますか?第二に、私はJavaScriptの未定義は変数が宣言されているがまだ割り当てられていないことを意味していました。この場合はvar numberを割り当てています。

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>

答えて

5

つだけのコード・パスは、それが再帰呼び出しから返すように、値を返します。関数がreturn文なしで終了した場合はJavaScriptでそのリターンは、最初のプロンプトが解除されると、別のプロンプト()反復はundefined

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

あなただけの文字列がprompt' 'から返されたことを言及する必要があります。 'isNaN( 'anystring')'は常に 'true'を返しますが、' Number.isNaN'は 'input'が' NaN'の場合にのみ 'true'を返します。 'parseInt'をお勧めします。 – naomik

+0

@naomik:そうではありません。 'isNaN(" ")=== false'なぜ偽を返すのか分かりませんが、おそらく' isNaN(parseFloat(input)) 'を試すことができます –

+0

@ThomasFありがとう、私はそれを知らなかった、 'window.isNaN'はゴミの一部です。 'Number.isNaN'はずっと使いやすくなっています。 – naomik

-1

と呼ばれているが、それの戻り値はどこにも捕獲されていません。最初の反復では、元の未定義の戻り値が返されます。

これを修正するには、ムーサの答えがあります。もう一つは、次のようになります。

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

window.promptは常に文字列を返すか、nullがそうundefinedをチェックする気にしない、あるいはまたisNaN

window.promptは文字列を返すために、あなたがするためにwindow.parseIntを使用する必要がありますそれを確実に数値に変換します。

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

関連する問題