Javascript 在 if/else 语句中嵌套 while 循环无法正确输出(无限循环?),我哪里出错了?

问题描述 投票:0回答:1

我在 if/else 语句中嵌入了两个循环(一个 while 和一个 if)。

我想检查用户输入是否是数字,如果不是,则设置用户可以重试的次数限制(3 次),并在用户重复次数耗尽时提醒用户。如果用户从未输入数字,则返回未定义。

或者,如果用户输入数字,则跳过检查并将数字作为整数数据类型返回。

function monthlyBudget(count = 3) {
    const SPEND = prompt("How much is your typical spend (in GBP) on books in a month? ");
    
    // check if the input is not a number.
    if (isNaN(SPEND)) {

        while (count > 0) {
            alert("Hmmm... I'm not sure I understood. Please try again.");
            console.log("Spend input is not a number.");

            count--
            console.log(count)
            monthlyBudget(count);
        }

        // if SPEND is not a number and count = 0.
        if (count == 0) {
            alert("Oh no! We are unable to process your request, please try again later.");
            return undefined
        }
    } else {
        return Number(SPEND)
    }
}

但似乎它一直持续到 count = 0 并输出 count = 0 警报,但随后它返回并立即输出“嗯......我不确定我是否理解。请再试一次。”然后返回“哦不!我们无法处理您的请求,请稍后重试。”

console.log 显示一旦计数达到 0,它会再次回到 1,然后再下降到 0,因此警报与计数相匹配,但我不确定为什么这段代码会这样做?

谁能指出我哪里错了?

我第一次尝试时,if/else 语句看起来略有不同:

if (isNaN(SPEND)) {
        alert("Hmmm... I'm not sure I understood. Please try again.");
        console.log("Spend input is not a number.");
        monthlyBudget();
} else {
        return Number(SPEND);
}

但是如果第一个输入(或后续输入)是字符串,则无论下一个输入是什么,该函数都只会返回第一个字符串输入。

我不确定为什么,因为

if (isNaN(SPEND))
没有返回,而且我不确定这是否仍然是第一个块中代码的问题,因为我认为我陷入了无限循环。

javascript loops if-statement while-loop infinite-loop
1个回答
1
投票

您尝试通过

while
循环和递归来实现循环。这是有问题的。此外,当您进行递归调用时,您将忽略此递归调用可能返回的答案。您应该
return
它并且不要再次循环。

所以改变这个:

monthlyBudget(count);

至:

return monthlyBudget(count);

现在您还可以将

while
替换为
if
,因为您肯定会执行该
return
。那里没有第二次迭代。重复是通过递归调用实现的,而不是
while
循环。

注意:通过

prompt
alert
询问用户输入不是一个好习惯。为此,请使用 HTML 输入控件。

© www.soinside.com 2019 - 2024. All rights reserved.