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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:24:01