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

制作JavaScript测验时点击Next按钮出现Reference error: can't find var cb求助

解决ReferenceError: cb未找到的问题

问题原因

你把cb函数定义在ab函数内部的switch分支里,这属于函数作用域内的局部函数。而HTML里的onclick="cb()"是在全局作用域下调用的,全局环境找不到这个函数,所以触发ReferenceError: can't find var cb。

解决方案

方案1:把cb移到全局作用域

直接将cb函数定义在ab外面,让全局环境能访问到:

// 全局定义cb函数
function cb() {
  document.getElementById("b").style.display = "block";
  document.getElementById("an").style.display = "none";
}

function ab() {
  var text;
  var quiza = prompt("is it gif or jif");
  switch(quiza) {
    case "gif":
      text = "Good";
      document.getElementById("a").style.display = "none";
      document.getElementById("an").style.display = "block";
      document.getElementById("counter").innerHTML = "1/10";
      break;
    case "jif":
      text = "No";
      break;
    default:
      text = "wrong that's not gif or jif";
  }
  document.getElementById("res").innerHTML = text;
}

方案2:用事件监听替代内联onclick(推荐)

移除HTML里的内联onclick,改用JS动态绑定事件,这样不用暴露全局函数,代码更干净:
修改后的HTML:

<div class="buttona" id="a"><button onclick="ab()">CLICK ME FOR 1st Q</button></div>
<div class="next" id="an"><button>Next</button></div>

修改后的JS:

function ab() {
  var text;
  var quiza = prompt("is it gif or jif");
  switch(quiza) {
    case "gif":
      text = "Good";
      document.getElementById("a").style.display = "none";
      const nextBtnContainer = document.getElementById("an");
      nextBtnContainer.style.display = "block";
      
      // 给Next按钮绑定点击事件
      nextBtnContainer.querySelector("button").addEventListener("click", function() {
        document.getElementById("b").style.display = "block";
        nextBtnContainer.style.display = "none";
      });
      
      document.getElementById("counter").innerHTML = "1/10";
      break;
    case "jif":
      text = "No";
      break;
    default:
      text = "wrong that's not gif or jif";
  }
  document.getElementById("res").innerHTML = text;
}

方案3:将cb挂载到window对象(不推荐,会污染全局)

如果非要保留内联onclick,可以把cb挂到window上,让全局能访问:

function ab() {
  var text;
  var quiza = prompt("is it gif or jif");
  switch(quiza) {
    case "gif":
      text = "Good";
      document.getElementById("a").style.display = "none";
      document.getElementById("an").style.display = "block";
      
      // 挂载到window,全局可访问
      window.cb = function() {
        document.getElementById("b").style.display = "block";
        document.getElementById("an").style.display = "none";
      }
      
      document.getElementById("counter").innerHTML = "1/10";
      break;
    case "jif":
      text = "No";
      break;
    default:
      text = "wrong that's not gif or jif";
  }
  document.getElementById("res").innerHTML = text;
}

推荐选择

优先用方案2,既避免了全局变量污染,也让事件绑定逻辑和UI操作更耦合,维护起来更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:20:55