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

Uncaught ReferenceError: totalScore未定义问题排查(无jQuery)

问题原因分析与解决方案

首先,咱们来拆解你遇到的核心问题,一步步帮你解决:

1. totalScore 未定义的真相

你已经在全局作用域声明了var totalScore;,理论上控制台应该能访问到它。出现Uncaught ReferenceError的大概率原因是外部JS文件路径错误——检查一下你的Scoreboard1javascript.js是否和HTML文件在同一目录,或者路径书写有没有拼写错误,导致脚本根本没加载成功,全局变量自然不存在。

如果路径没问题,那可能是代码执行中出现了其他错误(比如currentServePlayer未初始化),导致changeServePlayer函数没执行到totalScore = ...这行,此时控制台访问totalScore会显示undefined(注意,undefined和“未定义”是不同的,后者是变量不存在,前者是变量存在但没赋值)。

2. 发球方切换逻辑完全失效的核心错误

这才是你代码里最关键的问题:在changeServePlayer函数中,你错误地写了Number.isInteger == true,而不是判断Number.isInteger(totalScore / 2)的返回值。

Number.isInteger是一个内置函数,你直接把它和true比较,这个条件永远不会成立——因为函数引用不等于布尔值true。所以无论得分怎么变,发球方都不会切换。

修复后的changeServePlayer函数:

function changeServePlayer() {
  totalScore = currentScorePlayerOne + currentScorePlayerTwo;
  // 正确计算总得分是否为偶数
  const isEvenTotalScore = Number.isInteger(totalScore / 2);
  
  // 只有当发球方已初始化、总得分不为0且是偶数时,才切换发球权
  if (currentServePlayer && isEvenTotalScore && totalScore !== 0) {
    currentServePlayer = currentServePlayer === 1 ? 2 : 1;
  }
}

3. 其他需要修复的细节问题

  • 重复定义的changeServeIcon函数:你在外部JS和HTML的内联脚本中各定义了一次changeServeIcon,后者会覆盖前者,可能导致预期外的行为。建议删除其中一个,只保留一份定义。
  • 未初始化的currentServePlayer:如果用户还没点击Serve按钮就按了计分键(比如X/M),currentServePlayer是undefined,此时changeServePlayer里的逻辑不会执行,还可能引发其他问题。你可以在checkKeyPress函数开头添加判断:
    function checkKeyPress(key) {
      if (!currentServePlayer) {
        alert("请先点击Serve按钮选择发球方!");
        return;
      }
      // 后续的计分逻辑...
    }
    

优化建议(进阶)

作为初学者,你的代码已经很棒了,这里有几个小建议让它更健壮:

  • 缓存DOM元素:避免每次操作都调用getElementById,提前把元素存在变量里:
    const scorePlayerOneEl = document.getElementById('scorePlayerOne');
    const scorePlayerTwoEl = document.getElementById('scorePlayerTwo');
    const serveP1El = document.getElementById('serveP1');
    const serveP2El = document.getElementById('serveP2');
    
  • 复用计分逻辑:把加分减分的逻辑封装成函数,减少重复代码:
    function updateScore(player, change) {
      if (player === 1) {
        currentScorePlayerOne += change;
        // 确保得分不会小于0
        currentScorePlayerOne = Math.max(0, currentScorePlayerOne);
        scorePlayerOneEl.innerHTML = currentScorePlayerOne;
      } else {
        currentScorePlayerTwo += change;
        currentScorePlayerTwo = Math.max(0, currentScorePlayerTwo);
        scorePlayerTwoEl.innerHTML = currentScorePlayerTwo;
      }
      changeServePlayer();
      changeServeIcon();
      updateSet();
    }
    
    然后在checkKeyPress里调用:
    if (key.keyCode === 90) updateScore(1, -1); // Z减分
    if (key.keyCode === 88) updateScore(1, 1);  // X加分
    if (key.keyCode === 78) updateScore(2, -1); // N减分
    if (key.keyCode === 77) updateScore(2, 1);  // M加分
    
  • 使用keydown事件:相比keyup,keydown的响应更及时,体验更好。

内容的提问来源于stack exchange,提问作者Drumstick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:13:14