仿Wordle游戏调用返回函数报错:getData(...).isCorrect不是函数
问题分析与解决方案
核心错误原因
getData()是异步函数,调用后返回的是Promise对象,而非直接包含isCorrect方法的对象。所以getData().isCorrect()相当于在Promise上调用不存在的isCorrect方法,自然抛出错误。
如果去掉getData()的括号,函数根本不会执行,导致API请求、单词池初始化、游戏逻辑函数都不会被创建,游戏自然无法运行。
修复方案(推荐)
提前初始化游戏逻辑,将异步获取的游戏对象保存到全局变量,点击按钮时直接调用已初始化的方法:
1. 修改JavaScript代码
let gameInstance; // 页面加载时完成游戏初始化 async function initGame() { gameInstance = await getData(); } async function getData() { // 处理API返回的JS文件(原接口返回的是JS变量而非JSON) const response = await fetch("https://all-wordle-words.kobyk1.repl.co/script.js"); const text = await response.text(); // 提取JS文件中的words数组 const match = text.match(/var words = (\[.*?\]);/); if (!match) throw new Error("无法提取单词数据"); const wordsArray = JSON.parse(match[1]); const words = new Set(wordsArray); const chosen = wordsArray[Math.floor(Math.random() * wordsArray.length)]; function check(word) { let result = Array(5).fill("gray"); let chosenChars = [...chosen]; for (let i = 0; i < 5; i++) { if (word[i] === chosenChars[i]) { result[i] = "green"; chosenChars[i] = "G"; } else { for (let j = 0; j < 5; j++) { if (word[i] === chosenChars[j]) { result[i] = "yellow"; chosenChars[j] = "Y"; break; // 找到匹配后退出循环,避免重复标记 } } } } return result; } function isCorrect() { const word = document.getElementById("guess").value.toLowerCase().trim(); if (word.length !== 5) { alert("请输入5个字母的单词!"); return; } if (words.has(word)) { const result = check(word); const element = document.getElementById("guesses"); element.innerHTML += colorResult(word, result); if (chosen === word) { alert("恭喜你猜对了!"); } // 清空输入框 document.getElementById("guess").value = ""; } else { alert("这个单词不在词库中!"); } } function colorResult(word, result) { word = word.toUpperCase(); let columns = ""; for (let i = 0; i < 5; i++) { columns += `<td style="background-color: ${result[i]}; padding: 10px; font-size: 1.2em; border: 1px solid #000;">${word[i]}</td>`; } return "<tr>" + columns + "</tr>"; } return { check, isCorrect, colorResult }; } // 页面加载完成后自动初始化游戏 window.addEventListener("load", initGame);
2. 修改HTML按钮绑定
<button onclick="gameInstance.isCorrect()">Submit</button>
额外优化点
- 增加输入长度校验,确保用户输入5个字母
- 修复
check函数逻辑漏洞:找到黄色匹配后退出内层循环,避免同一字母被多次标记 - 提交后清空输入框,提升操作流畅度
- 给表格单元格添加基础样式,让结果显示更清晰
内容的提问来源于stack exchange,提问作者Koby K
相关产品推荐
相关产品推荐

