数字猜谜游戏while循环运行异常(脚本超时终止)问题排查
数字猜谜游戏while循环运行异常(脚本超时终止)问题排查
嘿,我来帮你搞定这个问题!你遇到的脚本超时终止,核心原因就是点击事件里的while(running)循环在搞鬼,咱们一步步拆解分析:
问题根源
当你点击按钮时,这个while(running)会立刻启动循环,只要running还是true,它就会一直跑下去。举个例子:你输入一个比答案小的数字,代码会提示“Too Low”,但running并没有被改成false,所以循环会马上再次执行——这时候guess还是之前那个错误的数字,又会触发同样的提示,无限重复下去。浏览器受不了这种无限循环的脚本,就会直接终止它,也就是你看到的超时提示。
另外还有个小坑:你一开始把guess赋值成了DOM元素,后来在点击事件里又把它改成了数字,第二次点击时guess已经是数字了,根本没有.value属性,这也会导致后续逻辑出错。
解决方案
我们完全不需要这个while循环,因为点击按钮本身就是每次触发一次判断逻辑,没必要让代码一直跑。同时要把DOM元素和输入值分开存储,避免变量被覆盖。
下面是修正后的完整代码:
HTML部分(保留你的原有代码即可)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Number Guessing Game</title> <link rel="stylesheet" href="style.css"> </head> <body> <label for="guess">Enter a number:</label> <input type="text" id="guess"> <button id="rollBtn">Roll</button> <h3 id="display"></h3> <script src="index.js"></script> </body> </html>
JavaScript部分(关键修改)
// NUMBER GUESSING GAME // Html dom elements to work with const rollBtn = document.getElementById("rollBtn"); const guessElement = document.getElementById("guess"); // 单独存储DOM元素,避免被覆盖 const display = document.getElementById("display"); // Other variables needed let running = true; let attempts = 0; const minNum = 1; const maxNum = 100; // 修正随机数生成逻辑,确保范围严格在1-100之间 const answer = Math.floor(Math.random() * (maxNum - minNum + 1)) + minNum; rollBtn.onclick = function(){ // 如果已经猜对,直接返回不执行后续逻辑 if(!running) return; // 每次点击都重新获取输入框的最新值 const guess = Number(guessElement.value); if(isNaN(guess)){ display.textContent = `Please, input a valid number between ${minNum} - ${maxNum}`; } else if(guess < minNum || guess > maxNum){ display.textContent = `Please, input a number between ${minNum} - ${maxNum}`; }else{ attempts++; if(guess < answer){ display.textContent = "Too Low, Try again"; } else if(guess > answer){ display.textContent = "Too High, Try again"; } else{ display.textContent =`Correct! the answer is ${answer}, It took you ${attempts} attempt(s)`; running = false; } } }
修改关键点说明
- 移除
while循环:每次点击按钮只执行一次判断逻辑,彻底避免无限循环。 - 分离DOM元素与输入值:用
guessElement存储输入框DOM节点,每次点击时通过它获取最新的输入值,避免变量覆盖问题。 - 增加终止判断:当用户猜对后,点击按钮不会再执行任何操作,逻辑更严谨。
- 优化随机数生成:确保生成的答案严格在
minNum到maxNum范围内。
这样修改后,脚本就不会再出现超时问题,猜谜游戏也能正常运行啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

