【问题标题】:Uncaught ReferenceError: Cannot access 'stocks' before initialization未捕获的 ReferenceError:在初始化之前无法访问“股票”
【发布时间】:2020-06-04 18:55:44
【问题描述】:

我正在尝试将一个对象导入另一个 JS 文件,但我不断收到此错误,未捕获的 ReferenceError: Cannot access 'stocks' before initialization。我已经申报了库存,并且我已经正确导入了它,所以我看不出我做错了什么。任何帮助深表感谢。谢谢。

在股票文件中:

export const stocks = {
    megaCorp: {
        name: 'Mega Corporation',
        value: decideStockValue(),
        portIn: 0,
        document: "mega"
    },

    lunaBake: {
        name: "Luna Baking",
        value: decideStockValue(),
        portIn: 1,
        document: "luna"
    },
}

在用户文件中:

import { stocks } from "./stocks.js";

export let user = {
    money: 2000,
    portfolio: [0, 0, 0, 0]
}

function getValue () {
    let value = user.money;
    let cannon = stocks.cannonRock.value * user.portfolio[0];
    let alpha = stocks.alphaComp.value * user.portfolio[1];
    let luna = stocks.lunaBake.value * user.portfolio[2];
    let mega = stocks.megaCorp.value * user.portfolio[3];
    value += cannon;
    value += alpha;
    value += luna;
    value += mega;
    return value;   
}

user.value = getValue();

【问题讨论】:

  • 您共享的代码在语法上没有问题,您可能不仅仅从您共享的代码中得到错误
  • 我在 user.js 中注释掉了所有有“股票”调用的行,它运行良好
  • 有意思,你在哪里运行代码?
  • 喜欢什么环境
  • Chrome 浏览器上的 localhost 服务器

标签: javascript module


【解决方案1】:

再次查看代码,它在语法上似乎很好,所以这不是一个答案,但我想分享一段代码,看看它的行为方式。

您共享的错误Uncaught ReferenceError: Cannot access 'variable_name' before initialization 在初始化之前访问词法变量时会引发(所谓的时间死区错误),但是在您共享的代码中没有什么应该引发此错误。

例如这段代码会抛出这个错误

const x = 3
function a(){
    console.log(x)
    const x = 5;
}
a()

假设错误确实来自用户文件,那么下面的代码可能会解决它。在代码中,你的 getValue 是一个应该被提升的函数表达式(这应该没问题),但可能是你使用的捆绑器行为不端。

import { stocks } from "./stocks.js";

const getValue = (stocks, money, portfolio) => {
  let value = money;
  let cannon = stocks.cannonRock.value * portfolio[0];
  let alpha = stocks.alphaComp.value * portfolio[1];
  let luna = stocks.lunaBake.value * portfolio[2];
  let mega = stocks.megaCorp.value * portfolio[3];
  value += cannon;
  value += alpha;
  value += luna;
  value += mega;
  return value;
};

const money = 2000;
const portfolio = [0, 0, 0, 0];
export const user = {
  money,
  portfolio,
  value: getValue(stocks, money, portfolio),
};


【讨论】:

    【解决方案2】:

    调试了一下之后,我关闭了服务器,然后又打开了。这一次,它工作得很好。我仍然不确定为什么会发生最初的错误,但现在它工作得很好。感谢大家的帮助

    【讨论】:

      【解决方案3】:

      这是某些依赖循环重载的经典示例 (c) Sergei Vohmianin

      您可以做的最简单的事情是将该对象移动到它的单独模块中,以省略像 app => method => app 这样的循环。

      【讨论】:

        【解决方案4】:

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

        当我尝试这样做时:

        require("dotenv-safe").config();
        console.log(process.env);
        
        const DATABASE_URI = process.env.DATABASE_URI;
        

        原来,问题是我错误地在同一个文件中进一步声明了进程,如下所示:

        const process = require("process");
        

        这个要求是不必要的,因为它在 Node 的全局上下文中可用。删除该行可以解决问题。

        【讨论】:

        • 'require' 不是标准 Javascript 的一部分,不应使用。改用“导入”。
        • require 属于 CommonJS 模块,在所有 Node.js 版本中都是标准的。 import 是 Node 13 中引入的 ES 模块语法。
        猜你喜欢
        • 2020-12-12
        • 2020-05-06
        • 2021-03-10
        • 2020-06-02
        • 2020-06-02
        • 2022-11-05
        • 1970-01-01
        • 1970-01-01
        • 2020-12-29
        相关资源
        最近更新 更多