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

JS开发抽牌游戏触发TypeError: card_name未定义报错如何解决

问题排查与修复方案

报错核心原因

你遇到的TypeError: card_name is not defined错误,以及大概率会后续出现的属性读取错误,核心触发点如下:

  • 随机索引生成逻辑错误:Math.round(Math.random() * 52)生成的整数范围是052,而你的cards数组只有52个元素,有效索引为051。当随机值为52时,cards[52]为undefined,此时给card_name赋值为undefined,后续访问card_name[0]时会抛出属性读取错误,部分运行环境下也会误报变量未定义。如果确认没有拼写错误,优先修复随机数逻辑即可解决该报错。
  • 额外排查点:确认cards、decks、cards_drawn三个变量都在draw_card函数的可访问作用域内声明,不存在跨作用域无法读取的问题。

其他逻辑缺陷修复

你的代码还有几处逻辑错误会导致抽牌功能无法正常运行:

  • 遍历已抽卡牌的判断逻辑错误:for...in遍历数组得到的是索引值,你当前拿索引和卡牌名称对比,永远无法匹配,计数逻辑完全失效。需要改为对比cards_drawn[i]和card_name[0]。
  • 抽牌计数未重置:drawn_times变量定义在while循环外部,每次进入下一轮抽牌循环时不会清零,计数结果永远叠加,逻辑完全错误。需要把变量声明放到while循环内部。
  • 全局变量泄漏:for (i in cards_drawn)中的循环变量i没有用let声明,会被自动提升为全局变量,造成变量污染。
  • 逻辑冗余:可以直接用数组方法统计已抽次数,无需手动遍历计数,代码可读性更高。

修复后的参考代码

const draw_card = () => {
  let drawn_card, card_name;
  // 循环找到符合条件的卡牌
  while (true) {
    // 生成0~51的有效随机索引
    drawn_card = Math.floor(Math.random() * 52);
    card_name = cards[drawn_card];
    // 统计当前卡牌已抽次数
    const drawn_times = cards_drawn.filter(item => item === card_name[0]).length;
    // 未超过牌组数量则可以抽牌
    if (drawn_times < decks) {
      cards_drawn.push(card_name[0]);
      break;
    }
  }
  return card_name;
}

draw_card();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 11:15:04