JS基础银行应用余额反复重置 如何保留运行累计总额?
问题根源
余额被重置和switch语句、break语句没有任何关系,问题出在currentBalance变量的作用域:你把它声明在了bankingApp函数内部,属于函数局部变量,每次点击按钮调用bankingApp时,都会重新执行let currentBalance = 0这行代码,直接把余额重置为初始值,自然没法累计之前的操作结果。
另外你现有代码还有一个隐藏bug:存款逻辑里只打印了存入金额,没有把金额累加到余额上,就算修复了变量作用域问题,存款操作也不会更新余额。
修复方案
你可以根据需求选择下面两种修改方式:
方案1:全局变量存储余额(修改成本最低,适合入门练习)
把currentBalance变量移到函数外部声明,作为全局变量,整个页面生命周期内只会初始化一次,每次调用函数都会复用同一个余额值:
// 把余额变量移到函数外部,只初始化一次 let currentBalance = 0; function bankingApp() { let userPrompt = prompt( "bank menu: w = withdrawal | d = deposit | b = balance | q = quit" ); switch (userPrompt) { case "w": function withdrawFunds() { let withdrawAmount = parseFloat(prompt("Withdraw amount: ")); // 简单输入校验,避免异常值 if(isNaN(withdrawAmount) || withdrawAmount <= 0) { console.log("请输入有效的取款金额"); return; } if(withdrawAmount > currentBalance) { console.log("余额不足,取款失败"); return; } currentBalance = currentBalance - withdrawAmount; console.log( "Withdraw: " + withdrawAmount + " New balance: " + currentBalance ); } withdrawFunds(); break; case "d": function depositFunds() { let depositAmount = parseFloat(prompt("Deposit amount:")); if(isNaN(depositAmount) || depositAmount <= 0) { console.log("请输入有效的存款金额"); return; } // 补上缺失的余额更新逻辑 currentBalance = currentBalance + depositAmount; console.log( "Deposit: " + depositAmount + " New balance: " + currentBalance ); } depositFunds(); break; case "b": function checkBalance() { console.log("Current balance: " + currentBalance); } checkBalance(); break; case "q": function quitProgram() { console.log("Quit the program."); } quitProgram(); break; default: console.log("That menu is not available."); } }
方案2:闭包封装(更规范,避免全局变量污染)
如果不想声明全局变量污染作用域,可以用闭包把余额变量封装起来,只会暴露操作方法,外部无法直接修改余额值:
const bankingApp = (function() { // 余额变量只会在初始化时赋值一次 let currentBalance = 0; return function() { let userPrompt = prompt( "bank menu: w = withdrawal | d = deposit | b = balance | q = quit" ); switch (userPrompt) { case "w": let withdrawAmount = parseFloat(prompt("Withdraw amount: ")); if(isNaN(withdrawAmount) || withdrawAmount <= 0 || withdrawAmount > currentBalance) { console.log("取款金额无效或余额不足"); return; } currentBalance -= withdrawAmount; console.log(`Withdraw: ${withdrawAmount} New balance: ${currentBalance}`); break; case "d": let depositAmount = parseFloat(prompt("Deposit amount:")); if(isNaN(depositAmount) || depositAmount <= 0) { console.log("请输入有效的存款金额"); return; } currentBalance += depositAmount; console.log(`Deposit: ${depositAmount} New balance: ${currentBalance}`); break; case "b": console.log(`Current balance: ${currentBalance}`); break; case "q": console.log("Quit the program."); break; default: console.log("That menu is not available."); } } })()
内容的提问来源于stack exchange,提问作者Carolyn Greenough
相关产品推荐
相关产品推荐

