JS游戏升级功能Failed未定义报错及金币校验逻辑异常求解
问题根因&修复方案
1. 错误根因
- 分支结构错位:你的
else if和最外层的if (!gameData.minorsettlementApplied)配对,仅当已经完成升级时才会判断金币是否足够,未升级且金币不足的场景没有对应处理分支,这是两个异常的共同核心原因 - 成本校验不一致:你要求的升级门槛是300金币,但
minorsettlement.buildcost定义为250,判断条件和实际扣费数值不统一 - 「Failed is not defined」报错:和分支错位直接相关,由于金币不足时不会走到对应分支,结合
var的变量提升特性,如果有全局作用域的代码引用该变量就会抛出未定义错误,调整分支位置后报错会自然消失 - 你遇到的升级状态异常修改问题,是代码缩进混乱导致大括号配对错误,
minorsettlementApplied = true逻辑脱离了金币判断分支导致的
2. 修复后完整代码
var gameData = { // 玩家属性 stonePerClick: 0, // 升级属性 stoneUpgradeCost: 25, woodPerClick: 0, woodUpgradeCost: 15, gold: 0, // 资源 wood: 0, stone: 0, planks: 0, plankcost: 300, minorsettlementApplied: false // 升级状态 } // 统一升级成本为300,和需求对齐 const minorsettlement = { woodgen: 40, buildcost: 300 } function settlementUpgrade() { // 先判断是否已升级 if (gameData.minorsettlementApplied) { document.getElementById("failed").innerHTML = "该升级已购买" return } // 未升级再判断金币是否足够 if (gameData.gold >= minorsettlement.buildcost) { gameData.gold -= minorsettlement.buildcost gameData.wood += minorsettlement.woodgen gameData.minorsettlementApplied = true document.getElementById("woodCount").innerHTML = "Wood: " + gameData.wood document.getElementById("accepted").innerHTML = "Purchased Upgrade." } else { // 金币不足直接提示 document.getElementById("failed").innerHTML = "Not Enough Gold." } } function UpgradedSettlementIncome() { gameData.wood += minorsettlement.woodgen // 注意原代码此处更新的是金币DOM,但修改的是木材数值,可根据需求调整 document.getElementById("goldIncome").innerHTML = "Gold: " + gameData.gold // 如需同步更新木材展示可取消下一行注释 // document.getElementById("woodCount").innerHTML = "Wood: " + gameData.wood } var buildingUpgraded = window.setInterval(function () { if (gameData.minorsettlementApplied) UpgradedSettlementIncome() }, 1000)
3. 可选优化点
- 升级成功/失败的提示可以加定时消失逻辑,避免一直显示在页面上
- 可以把所有常量数值统一到
gameData或者单独的配置对象里,避免后续修改出现成本不一致的问题
内容的提问来源于stack exchange,提问作者Yami
相关产品推荐
相关产品推荐

