JavaScript实现ATM存取款函数 校验逻辑错误致程序异常退出
简易ATM模拟程序Bug修复
问题表现
- deposit(存款)函数:测试无效输入场景时可正常弹出错误提示,但提示后程序直接退出,输入合法值时功能运行正常
- withdrawal(取款)函数:即便输入合法的取款金额,也会弹出输入无效的错误提示,随后程序直接退出,无法完成正常取款流程
核心错误点
- 代码存在冗余无效语法:开头多余的
*/注释闭合标记、getBalance函数内残留的`enter code here`占位内容,会触发JS解析异常 - 取款函数校验逻辑完全写反:错误分支判断条件写了
withdrawal > 0,而合法取款金额本身就是大于0的正数,导致所有合法输入都会被判定为无效 - 所有功能函数存在重复调用
atm()的问题:比如存款成功后先调用getBalance()(该函数内部已经调用了atm()回到主菜单),又额外调用一次atm(),递归深度快速溢出就会导致程序直接退出;无效输入递归调用当前函数后没有加return阻断,也会触发同样的栈溢出问题 - 退出函数逻辑无效:只定义了关闭窗口的内部函数但没有实际执行,选择退出时没有任何效果
- 存款函数冗余判断:
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
相关产品推荐
相关产品推荐

