JavaScript Discord机器人switch语句中const重复声明报错解决方案咨询
解决switch case中重复声明常量的问题
在使用switch/case开发Discord测试机器人时,两个命令的case分支中都用const声明了user常量,导致抛出错误Identifier 'user' has already been declared。这是因为JavaScript的switch结构中,所有case分支共享同一个块级作用域,const不允许在同一作用域内重复声明同名变量。
解决方法:给每个case分支添加独立作用域
给每个case的代码块包裹花括号{},让每个分支拥有自己的块级作用域,这样const声明的user只会在当前分支的作用域内生效,不会与其他分支冲突。
修改后的代码示例:
case "avatar": { const user = message.mentions.users.first() || client.users.cache.get(args[0]) || await client.users.fetch(args[0]) || message.author if (!user) return message.edit(`Aucun utilisateur de trouvé pour \`${args[0] || "rien"}\``) message.edit(`Voici l'avatar de **${user.tag}**:\n${user.displayAvatarURL({dynamic: true, size: 4096})}`) break; } case "userinfo": { if (!message.guild) return message.edit("Commande utilisable uniquement sur un serveur") const user = message.mentions.members.first() || client.members.cache.get(args[0]) || await client.members.fetch(args[0]) || message.member if (!user) return message.edit(`Aucun utilisateur de trouvé pour \`${args[0] || "rien"}\``) break; }
替代方案:使用let声明变量
如果不想添加花括号,可以在switch外部用let声明user变量,然后在每个case分支中直接赋值(注意不要重复声明):
let user; case "avatar": user = message.mentions.users.first() || client.users.cache.get(args[0]) || await client.users.fetch(args[0]) || message.author if (!user) return message.edit(`Aucun utilisateur de trouvé pour \`${args[0] || "rien"}\``) message.edit(`Voici l'avatar de **${user.tag}**:\n${user.displayAvatarURL({dynamic: true, size: 4096})}`) break; case "userinfo": if (!message.guild) return message.edit("Commande utilisable uniquement sur un serveur") user = message.mentions.members.first() || client.members.cache.get(args[0]) || await client.members.fetch(args[0]) || message.member if (!user) return message.edit(`Aucun utilisateur de trouvé pour \`${args[0] || "rien"}\``) break;
这种方法虽然可行,但变量会存在于整个switch的作用域中,不如第一种方法的块级作用域清晰,推荐优先使用添加花括号的方案。
内容的提问来源于stack exchange,提问作者Sans
相关产品推荐
相关产品推荐

