因此,大约2周前,我在自己的机器人中添加了一个经济系统,并且现在已经尝试修复它的错误已有4天了,我遇到了很多错误,实际上我是一个粘在椅子上的斑点,不断出现精神崩溃,把这个想出来(解决;计算出;弄明白。

我当前遇到的错误是:ReferenceError:未定义utea?

我在脚本中的消息事件开始时定义了utea:

client.on("message", msg => { // When user sends chat message

    let userData = JSON.parse(fs.readFileSync(__dirname + '/Storage/userData.json', 'utf8'))

    // LET VARS
    let content = msg.content.toLowerCase()
    if (msg.guild !== null) {
        // CASE COIN CURRENCY
        if (!userData[msg.author.id + msg.guild.id]) userData[msg.author.id + msg.guild.id] = {}
        if (!userData[msg.author.id + msg.guild.id].money) userData[msg.author.id + msg.guild.id].money = 5

        // ITEMS
        if (!userData[msg.author.id + msg.guild.id].tea) userData[msg.author.id + msg.guild.id].tea = 0
        if (!userData[msg.author.id + msg.guild.id].milk) userData[msg.author.id + msg.guild.id].milk = 0
        if (!userData[msg.author.id + msg.guild.id].cof) userData[msg.author.id + msg.guild.id].cof = 0
        // ITEMS >B> USAGE VARS
        let utea = 0
        let umilk = 0
        let ucof = 0
    }

    fs.writeFile(__dirname + '/Storage/userData.json', JSON.stringify(userData), (err) => {
        if (err) console.error(err)
    })


导致它的行:

if (utea == 0) { // this line right here <<<
    // code stuff
}

最佳答案

问题是范围。


  MDN: let语句声明一个块作用域局部变量,可以选择将其初始化为一个值。


换句话说,此变量utea仅存在于if (msg.guild !== null) { }块中

但是,如果您写:

var utea = 0


看到:


  MDN: var语句声明一个变量,可以选择将其初始化为一个值。


此变量将不会限制在块内,您的代码应该可以工作。

我会说,这不是一个好习惯。在Ecma上添加letconst的原因之一是为了防止在大范围内误导变量的使用。

要继续使用let,请将变量声明放在if语句之外:

let utea = 0

if (msg.guild !== null) {
  // ...
}

// ...

if (utea == 0) {
  // ...
}

10-06 05:05