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

编写井字棋获胜判断函数时遇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,顺便给你指出来:

  1. 原代码中$(section).each((div) => {的div参数其实是遍历索引,不是DOM元素!正确的参数顺序是(index, element),而且DOM元素要转成jQuery对象才能调用.hasClass()。
  2. 原代码里的for(let i=1; i<=2; i++)逻辑绕得很,用every()方法可以直接判断所有元素是否属于同一个玩家,简洁得多。
  3. 找到获胜者后要立即停止遍历,不然会做无用的计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:14:06