递归提示返回undefined

时间:2016-07-08 03:13:31

标签: javascript

今天早上,当我尝试实施一个无休止的提示系统时,我发现了一些奇怪的事情。

以下代码在2种情况下返回2种不同的输出:

场景1:在第一次提示时输入数字,然后确定

输出1: number that was entered

场景2:取消第一个提示,然后输入数字和确定

输出2: undefined

我很困惑为什么会这样。首先,当我在if语句中检查时,它是如何返回undefined的?其次,我的印象是,在JavaScript中,undefined意味着已经声明了一个变量,但尚未分配,在这种情况下,我正在分配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>

3 个答案:

答案 0 :(得分:5)

只有一个代码路径返回一个值,使其从递归调用返回。在JavaScript中,如果函数在没有return语句的情况下结束,则返回undefined

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

答案 1 :(得分:3)

window.prompt始终返回字符串或null,因此请勿检查undefinedisNaN

此外,由于window.prompt会返回一个字符串,因此您需要使用window.parseInt才能将其可靠地转换为数字。

&#13;
&#13;
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())
&#13;
&#13;
&#13;

答案 2 :(得分:-1)

当第一个提示被取消时,会调用另一个Prompt()迭代,但不会在任何地方捕获它的返回值。然后第一次迭代返回原始未定义的返回值。

Musa的回答显示了解决这个问题的一种方法。另一个是:

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