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

JavaScript实现ATM存取款函数 校验逻辑错误致程序异常退出

简易ATM模拟程序Bug修复

问题表现

  • deposit(存款)函数:测试无效输入场景时可正常弹出错误提示,但提示后程序直接退出,输入合法值时功能运行正常
  • withdrawal(取款)函数:即便输入合法的取款金额,也会弹出输入无效的错误提示,随后程序直接退出,无法完成正常取款流程

核心错误点

  1. 代码存在冗余无效语法:开头多余的*/注释闭合标记、getBalance函数内残留的`enter code here`占位内容,会触发JS解析异常
  2. 取款函数校验逻辑完全写反:错误分支判断条件写了withdrawal > 0,而合法取款金额本身就是大于0的正数,导致所有合法输入都会被判定为无效
  3. 所有功能函数存在重复调用atm()的问题:比如存款成功后先调用getBalance()(该函数内部已经调用了atm()回到主菜单),又额外调用一次atm(),递归深度快速溢出就会导致程序直接退出;无效输入递归调用当前函数后没有加return阻断,也会触发同样的栈溢出问题
  4. 退出函数逻辑无效:只定义了关闭窗口的内部函数但没有实际执行,选择退出时没有任何效果
  5. 存款函数冗余判断:parseFloat处理空输入、非数字输入时会直接返回NaN,不需要额外判断输入值是否为空字符串

修复后可运行代码

let accountName = "Missy Jones",
    balance = 100;

function getBalance() {
    alert('Your current balance is: ' + balance);
    atm();
}

function deposit() {
    let depositAmount = parseFloat(prompt('How much would you like to deposit?'));
    if (isNaN(depositAmount) || depositAmount <= 0) {
        alert('Error: please enter a valid input!');
        deposit();
        return;
    }
    balance += depositAmount;
    getBalance();
}

function withdrawal() {
    let withdrawAmount = parseInt(prompt("How much do you want to withdraw?"));
    // 校验规则:非数字、金额小于等于0、取款额超过余额均为无效
    if (isNaN(withdrawAmount) || withdrawAmount <= 0 || withdrawAmount > balance) {
        alert("Input invalid, please try again");
        withdrawal();
        return;
    }
    balance -= withdrawAmount;
    getBalance();
}

function getAccountName() {
    alert("Name of account: " + accountName)
    atm();
}

function error() {
    alert('Error: accepted numbers are 1 through 5.');
    atm();
}

function exit() {
    alert("Thank you for using the ATM. Goodbye!");
    window.close();
}

function atm() {
    var choice = parseInt(prompt('Select a choice 1.) Balance 2.) Deposit 3.) Withdrawal 4.) Get Account Name  5.) Exit'));

    if (choice === 1) {
        getBalance();
    } else if (choice === 2) {
        deposit();
    } else if (choice === 3) {
        withdrawal();
    } else if (choice === 4) {
        getAccountName();
    } else if (choice === 5) {
        exit();
    } else {
        error();
    }
}

atm();

调整说明

  • 清理了所有无效语法片段,避免基础解析错误
  • 修正取款函数校验逻辑,新增余额不足的判断,符合真实ATM业务规则
  • 所有递归重输的逻辑后增加return终止当前函数执行,移除所有重复的atm()调用,避免递归栈溢出导致程序意外退出
  • 将函数内和函数同名的变量重命名,避免标识符冲突
  • 补全退出函数的执行逻辑,修正错误提示的选项范围

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 21:54:32