编写井字棋获胜判断函数时遇winnerSection.each is not a function错误
为什么我的井字棋获胜判断函数会报错"winnerSection.each is not a function"?
咱们先直接说错误原因:你定义的winnerSection是一个原生JavaScript数组,而.each()是jQuery专属的遍历方法——原生JS数组根本没有这个内置方法,所以浏览器才会抛出“不是函数”的错误。
具体问题拆解
看你这段代码:
const winnerSection = ['row1', 'row2', 'row3','column1', 'column2', 'column3', 'dag1', 'dag2' ]; winnerSection.each((section) => { ... })
winnerSection就是普通的JS数组,只有jQuery对象才能调用.each()方法,原生数组不认这个语法。
修正方案(两种可选)
方案1:用原生JS数组的.forEach()遍历(推荐)
这是最标准的原生写法,不需要依赖jQuery,逻辑也更清晰:
function whoWonGame(){ const winnerSection = ['row1', 'row2', 'row3','column1', 'column2', 'column3', 'dag1', 'dag2' ]; let winner = null; winnerSection.forEach((section) => { // 获取当前行/列/对角线的所有子元素 const cells = $(`#${section}`).children(); // 检查是否所有格子都是player1 const isPlayer1Win = cells.toArray().every(cell => $(cell).hasClass('player1')); // 检查是否所有格子都是player2 const isPlayer2Win = cells.toArray().every(cell => $(cell).hasClass('player2')); if (isPlayer1Win) { winner = 'player1'; // 找到获胜者后直接跳出遍历,不用继续检查 return false; } if (isPlayer2Win) { winner = 'player2'; return false; } }); return winner; }
方案2:把数组转成jQuery对象再用.each()(不推荐,没必要多此一举)
如果你非要用jQuery的.each(),可以把数组包装成jQuery对象:
// 把原生数组转为jQuery对象 $(winnerSection).each((index, section) => { // 后续逻辑和上面的修正版一致 });
额外要改的几个小问题
原代码里还有几个逻辑bug,顺便给你指出来:
- 原代码中
$(section).each((div) => {的div参数其实是遍历索引,不是DOM元素!正确的参数顺序是(index, element),而且DOM元素要转成jQuery对象才能调用.hasClass()。 - 原代码里的
for(let i=1; i<=2; i++)逻辑绕得很,用every()方法可以直接判断所有元素是否属于同一个玩家,简洁得多。 - 找到获胜者后要立即停止遍历,不然会做无用的计算。
内容的提问来源于stack exchange,提问作者Solomon sokoya
相关产品推荐
相关产品推荐

