函数返回值传入其他函数返回undefined 算术测验APP答题判错问题
问题原因
- 你用
const在全局声明的correctAnswer只会在脚本首次加载时计算一次,const声明的常量无法二次赋值,所以这个值永远是第一道题的计算结果,后续更换题目后也不会更新,自然会出现后续答对也判错的问题。 - 你把答案计算逻辑放到
checkAnswer中会报错的原因是:checkAnswer是用户提交答案时触发的执行逻辑,此时调用generateQuestion()会直接生成新题目覆盖页面上用户正在作答的旧题,用新题的答案和用户针对旧题输入的答案比对自然无法匹配,逻辑完全错位。
解决方案
调整逻辑:每次生成新题时同步计算并存储当前题的正确答案,提交作答时直接调用预存的答案比对,比对完成后再生成下一道题。
修改后的代码示例如下:
- 先声明可变的全局变量存储当前题的正确答案,替换原全局的
correctAnswer声明:
let currentCorrectAnswer; let score = 0; // 确保你的score变量也有正确的全局声明
- 修改
generateQuestion函数,生成题目的同时计算并存储答案:
function generateQuestion() { const newQuestion = quizzes[Math.trunc(Math.random() * quizzes.length)]; question.textContent = newQuestion; // 生成题目时直接计算正确答案存入全局变量 currentCorrectAnswer = eval(newQuestion); return newQuestion; }
- 页面初始化时调用一次
generateQuestion()生成第一道题,不要在全局执行答案计算逻辑。 - 修改
checkAnswer函数,直接调用预存的答案比对,判定完成后再生成下一题:
function checkAnswer() { const userInput = Number(answer.value); if (currentCorrectAnswer === userInput) { feedback.textContent = "Correct!"; score++; document.querySelector(".score").textContent = score; } else { feedback.textContent = "Wrong!"; } answer.value = ""; // 判定完成后再生成下一道题 generateQuestion(); }
注意事项
如果你的quizzes数组内容完全是你自己预设的固定算术题,用eval没有风险;如果后续涉及用户可输入的表达式内容,建议替换eval为手动实现的算术表达式解析逻辑,避免代码注入风险。
内容的提问来源于stack exchange,提问作者Adesanya Adeniyi Marvellous
相关产品推荐
相关产品推荐

