【问题标题】:ReferenceError: Cannot access 'prefixfile' before initializationReferenceError:初始化前无法访问“前缀文件”
【发布时间】:2021-07-12 10:02:30
【问题描述】:

我在问这个之前搜索了stackoverflow,没有一个真正解决我的问题

我正在编写一个不和谐的机器人,并且正在编写一种具有自定义前缀的方法。到目前为止,我有这个用于处理公会前缀不在 json 文件中的情况。

const prefixfile = require('./prefixes.json');
function writePrefix(guildid) {
    const currentprefixes = prefixfile;
    
    currentprefixes[guildid] = "!";
    fs.writeFile('./prefixes.json', JSON.stringify(currentprefixes), output => {
        console.log(output);
    });
    delete require.cache[require.resolve(`./prefixes.json`)];
    const prefixfile = require('./prefixes.json');
}

我收到错误ReferenceError: Cannot access 'prefixfile' before initialization

编辑:我已经解决了这个问题并得到了另一个:

fs.writeFile('./prefixes.json', JSON.stringify(currentprefixes), output => {
        console.log(output);
});

不会向 ./prefixes.json 写入任何内容,即使 currentprefixes 有应该写入的数据。

有什么想法吗?

【问题讨论】:

    标签: javascript node.js discord.js


    【解决方案1】:

    即使在函数外部声明了名为prefixfile 的变量,函数的第一行也会引用在本地声明的同名变量——即使此时它仍未声明。发生这种情况是因为您的程序的所有变量都在编译时添加到它们各自的词法范围 - 在任何代码有机会运行之前。

    但是,由于局部变量是用const 声明的,因此在实际声明之前尝试访问它会导致您看到ReferenceError

    有关这方面的更多信息,请参阅 TDZ(时间死区)说明:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#temporal_dead_zone_tdz

    【讨论】:

    • 我已经解决了这个问题。我现在有一个不同的问题,当 fs.writeFile 应该写 currentprefix 时,它什么都不写。 currentprefix 有数据(通过我为调试而制作的 eval 命令确认,还有 console.log)
    【解决方案2】:

    就像 IAmDranged 所说,变量 prefixfile 没有在函数中声明。我通过不使用函数并将其全部移动到我的 if 语句中来解决这个问题。我的另一个问题是 fs.writeFile() 没有写任何东西 - 我通过使用 fs.writeFileSync() 修复了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 2021-09-10
      • 2020-10-23
      相关资源
      最近更新 更多