JavaScript随机乐透生成器对象使用不当引发TypeError报错咨询
JS多游戏乐透生成器类型错误修复
报错核心原因
你的代码有3个核心语法和逻辑错误,直接触发Uncaught TypeError:
forEach回调传参语法错误:你写的game.forEach(lottoResults())会在代码执行到这一行时立刻调用lottoResults函数,而不是把函数作为回调传给forEach等待遍历的时候执行。此时函数执行没有绑定任何游戏对象,非严格模式下this指向全局window,严格模式下this是undefined,访问this.results自然拿到undefined,给undefined设置length属性直接抛类型错误。- 内部函数调用同样存在传参错误:
this.results.forEach(duplicateCheck())、this.results.forEach(lottoBall())也加了括号立刻执行函数,且这两个函数你没有给出完整实现,就算this指向正确也会报函数不存在的错误。 - 数组长度设置逻辑无效:就算this指向正确,给空数组设置
length = n只会生成带n个空槽的稀疏数组,不会自动生成对应数量的乐透号码,后续遍历也拿不到有效值。
修复后可运行代码
const games = [ {name: "Lotto Texas", balls: 6, numbers: 54, start: 1, duplicates: false, bonusBall: false, results: []}, {name: "Pick 3", balls: 3, numbers: 10, start: 0, duplicates: true, bonusBall: false, results: []}, {name: "Powerball", balls: 5, numbers: 69, start: 1, duplicates: false, bonusBall: true, bonusNumbers: 26, results: [], bonus: []} ]; // 生成指定范围内的单个随机号码 function getRandomBall(max, start) { return Math.floor(Math.random() * (max - start + 1)) + start; } // 为单个游戏生成开奖结果 function generateResult(game) { // 清空历史结果 game.results = []; // 生成指定数量的普通球 while (game.results.length < game.balls) { const currentNum = getRandomBall(game.numbers, game.start); // 不允许重复时跳过已存在的号码 if (!game.duplicates && game.results.includes(currentNum)) continue; game.results.push(currentNum); } // 按规则生成额外球 if (game.bonusBall) { game.bonus = [getRandomBall(game.bonusNumbers, game.start)]; } } // 遍历所有游戏生成结果 games.forEach(game => generateResult(game)); // 打印结果验证 console.log(games);
关键调整说明
- 放弃容易出错的
this绑定写法,直接把forEach遍历到的当前游戏对象作为参数传入生成函数,从根源避免this指向混乱的问题 - 去掉所有函数传参时多余的括号,只有需要立刻执行的场景才给函数加
(),作为回调传递时只传函数名/箭头函数引用 - 用循环生成号码替代修改数组length占空槽的写法,同时内置重复校验逻辑,适配不同游戏的重复号码规则
- 补全了随机数生成、bonus球生成的缺失逻辑,覆盖你配置里的所有规则项
内容的提问来源于stack exchange,提问作者cgalbreath
相关产品推荐
相关产品推荐

