2016-07-08 80 views
4

当我试图实现一个无止境的提示系统时,我注意到今天早上有些奇怪的事情。递归提示返回undefined

以下代码返回下2个方案2个不同的输出:

方案1:上第一提示和输入数字确定

输出1:number that was entered


情景2:取消第一提示然后输入数字并确定

输出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

只有一个代码路径返回一个值,让它从递归调用返回。在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'返回。如果'input'实际上是'NaN','isNaN('anystring')'将总是返回'true',而'Number.isNaN'只会返回'true'。推荐'parseInt'等。 – naomik

+0

@naomik:不正确。 'isNaN(“”)=== false'我不知道它为什么返回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())