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

数字猜谜游戏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;
        }
    }
}

修改关键点说明

  1. 移除while循环:每次点击按钮只执行一次判断逻辑,彻底避免无限循环。
  2. 分离DOM元素与输入值:用guessElement存储输入框DOM节点,每次点击时通过它获取最新的输入值,避免变量覆盖问题。
  3. 增加终止判断:当用户猜对后,点击按钮不会再执行任何操作,逻辑更严谨。
  4. 优化随机数生成:确保生成的答案严格在minNum到maxNum范围内。

这样修改后,脚本就不会再出现超时问题,猜谜游戏也能正常运行啦!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 07:17:59