You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript防御性错误处理:while循环无限循环问题求助

问题分析与修复

你的代码出现无限循环且不显示prompt的核心原因有几个:

  1. 未接收函数返回值:promptTime、promptSpeed、promptDistance中,调用notNumber后没有将返回的合法数字赋值给原变量,导致原变量始终是NaN,后续逻辑持续触发错误处理。
  2. 变量覆盖与提示异常:notNumber函数内部用let input覆盖了参数input,且首次调用时传入的是NaN(原变量为NaN),导致prompt提示变成"Enter your NaN",同时空值判断无效(Number("")会转为0,input == ""永远不成立)。
  3. 无效判断逻辑:比如distance == Number这种写法完全错误,Number是构造函数,不可能等于计算出的数值。

修正后的代码

const ask = prompt('Calculate distance(d), time (t) or speed (s)');

// 重构为语义明确的合法数字获取函数
function getValidNumber(promptText) { 
    while (true) {
        try {
            const userInput = prompt(`Enter your ${promptText}`);
            // 先处理空输入(含纯空格)
            if (!userInput || userInput.trim() === "") {
                throw "Empty input is not allowed";
            }
            const num = Number(userInput);
            if (isNaN(num)) {
                throw "Please enter a valid number";
            }
            return num;
        } catch (err) {
            console.log(err);
        }
    }
}

function promptTime() {
    let time = Number(prompt('Enter your Time'));
    if (isNaN(time)) {
        time = getValidNumber('Time'); // 接收返回值
    }
    return time;
}

function promptSpeed() {
    let speed = Number(prompt('Enter your Speed'));
    if (isNaN(speed)) {
        speed = getValidNumber('Speed');
    }
    return speed;
}

function promptDistance() {
    let distance = Number(prompt('Enter your Distance'));
    if (isNaN(distance)) {
        distance = getValidNumber('Distance');
    }
    return distance;
}

if (ask === 'd') {
    const time = promptTime();
    const speed = promptSpeed();
    const distance = time * speed;
    console.log(`Your distance is ${distance}`);
} else if (ask === 't') {
    const distance = promptDistance();
    const speed = promptSpeed();
    if (speed === 0) {
        console.log("Speed can't be zero!");
        return;
    }
    const time = distance / speed;
    console.log(`Your time is ${time}`);
} else if (ask === 's') {
    const distance = promptDistance();
    const time = promptTime();
    if (time === 0) {
        console.log("Time can't be zero!");
        return;
    }
    const speed = distance / time;
    console.log(`Your speed is ${speed}`);
} else {
    console.log('Please enter a valid option: d, t, or s!');
}

关键改进说明

  • 重命名函数为getValidNumber,语义更清晰,接收提示文本作为参数,避免变量覆盖问题。
  • 在转数字前判断空输入,解决原代码无法捕获空值的问题。
  • 修复prompt函数中未接收返回值的错误,确保变量被更新为合法数字。
  • 增加了除以0的判断,避免计算出Infinity的情况。
  • 使用const声明常量,模板字符串优化输出格式。

内容的提问来源于stack exchange,提问作者Vermillion Orange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:05:22