Conway生命游戏实现:点击Next按钮代码无报错停止,仅首个console.log执行
根因
- 浏览器触发按钮点击事件时,会自动把
MouseEvent事件对象作为第一个实参传入绑定的回调函数 - 你直接把
nextGen绑定为点击回调,nextGen第一个形参定义为rows,事件对象直接覆盖了默认值30,此时rows是MouseEvent实例,不是数字 - 循环判断
i < rows时,JS隐式将两侧转数字,MouseEvent转数字结果为NaN,0 < NaN恒为false,外层循环直接终止,内层循环里的console.log("TWO")没有执行机会 - 整个流程没有访问任何对象属性,因此不会抛出报错,完全匹配现象
修复步骤
修改事件绑定逻辑,避免事件对象传入
nextGen:nextButton.addEventListener('click', () => nextGen(), false);这样触发回调时
nextGen的两个形参都是undefined,会正常使用默认的30行、50列参数。优化二维数组生成逻辑,消除隐式坑:
你原本用reduce生成二维数组的写法依赖push返回值配合&&cur,可读性差且容易因后续修改出bug,可替换为更直观的切片实现:// 替换原本的reduce代码 let current = []; for (let i = 0; i < rows; i++) { current.push(flatBoard.slice(i * columns, (i + 1) * columns)); }
补充说明
当前的状态计算逻辑本身没问题:先将旧状态存为current快照,再基于快照计算每个格子的下一代状态,最后更新复选框,不会出现边算边改导致状态错乱的问题。
内容的提问来源于stack exchange,提问作者anotherOne
相关产品推荐
相关产品推荐

