JavaScript中if条件满足却执行else分支的代码问题排查
为什么我的if条件明明满足却执行else分支?
我一眼就看出问题所在了——变量作用域冲突!你的evolve()函数里,在if代码块内部用var重新声明了和全局变量同名的变量(比如coins、timesbuyj1等),而var的作用域是函数级的,这些变量声明会被自动提升到函数顶部,导致你在条件判断里的coins >= 1000000000其实是在判断一个未初始化的局部变量(值为undefined),自然不满足条件,直接跳去执行else分支。
举个简化的例子,你当前的代码逻辑相当于:
function evolve() { // var声明被提升到这里,此时所有用var声明的变量都是undefined var coins, timesbuyj1, price01cs, timesbuyj2, price1cs, timesbuyj3, price8cs, timesbuyj4; // undefined >= 1000000000 结果是false,直接进else if (coins >= 1000000000 && timesbuyj1 >= 10 && timesbuyj2 >= 10 && timesbuyj3 >= 10) { evolutions = evolutions += 1 coins = 0 // 这里赋值的是局部coins,根本没碰全局变量 timesbuyj1 = 0 // ...其他变量赋值 } else { alert("You don't meet the requirements.") } }
修复方案超级简单:
去掉if块内部所有变量前面的var,直接赋值给全局变量(假设这些变量是全局定义的):
function evolve() { if (coins >= 1000000000 && timesbuyj1 >= 10 && timesbuyj2 >= 10 && timesbuyj3 >= 10) { evolutions += 1 // 这里可以简化写法,不用重复写evolutions = coins = 0 timesbuyj1 = 0 price01cs = 15 timesbuyj2 = 0 price1cs = 100 timesbuyj3 = 0 price8cs = 1100 timesbuyj4 = 0 // 此处为无关代码 } else { alert("You don't meet the requirements.") } }
额外优化建议:
- 尽量避免使用全局变量,如果这些变量需要在函数间共享,可以用一个全局对象封装,减少变量污染:
const gameState = { coins: 0, timesbuyj1: 0, timesbuyj2: 0, timesbuyj3: 0, evolutions: 0, price01cs: 0, // ...其他游戏状态变量 }; function evolve() { if (gameState.coins >= 1000000000 && gameState.timesbuyj1 >= 10 && gameState.timesbuyj2 >= 10 && gameState.timesbuyj3 >= 10) { gameState.evolutions += 1 gameState.coins = 0 gameState.timesbuyj1 = 0 gameState.price01cs = 15 // ...其他赋值操作 } else { alert("You don't meet the requirements.") } }
这样代码更清晰,也更容易维护。
- 可以在函数开头加个调试语句,确认变量值是否真的满足条件:
console.log("当前状态值:", coins, timesbuyj1, timesbuyj2, timesbuyj3);
避免是变量本身数值没达标导致的问题。
内容的提问来源于stack exchange,提问作者Discusser
相关产品推荐
相关产品推荐

