【问题标题】:Can an imported node module call a function which was initialized in the main module?导入的节点模块可以调用在主模块中初始化的函数吗?
【发布时间】:2021-09-22 19:35:51
【问题描述】:

我编写了一个模块来包含我正在处理的大型 Javascript 代码库中一些不那么有趣的部分,称之为 boring.js

它是从一个主模块导入的,它完成了大部分更有趣的工作,称之为main.js

boring.js 中有一个类叫做Log,它被导出到main.js 并实例化为一个变量log。调用函数log.save(newLogMsg)newLogMsg 保存到文件中。

log.save(newLogMsg)main.js 调用时工作正常

当我尝试从位于boring.js 的函数内部调用log.save(newLogMsg) 时,我收到错误消息:

ReferenceError: log is not defined

这让我感到困惑,因为let log = new Log 在我调用驻留在导入模块中的相关函数(来自main.js)之前已在主模块中初始化。

附带问题:为什么我可以从我选择的任何模块中调用console.log(newLogMsg)?我该如何为我的 Log 类实现类似的功能?

【问题讨论】:

    标签: javascript node.js module scope export


    【解决方案1】:

    导入的模块无法访问导入它的模块的命名空间。

    假设您有一个名为 module.js 的模块,如下所示:

    // module.js
    exports.x = 10;
    

    还有一个导入它的脚本main.js

    // main.js
    const s = "abc";
    const m = require('./module');
    

    这是运行main.js时发生的情况:

    • 第 1 行:字符串 "abc" 映射到主命名空间中的名称 s
    • 第 2 行:require 函数执行名为 module.js 的脚本和 返回其export 对象。该脚本在其自己的范围内运行并且不 对正在导入它的脚本一无所知。因此它不能 参见main.js 中定义的常量s
    • 第2行:require(模块的export对象)的返回值为 分配给在main.js 中定义的常量m

    关于你的附带问题:

    • 您可以将log 对象作为参数传递给定义的函数 里面module.js
    • 您可以在第三个模块中定义log,并同时要求main.jsmodule.js

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-17
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 2016-12-23
      相关资源
      最近更新 更多