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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:21:14