导入的节点模块可以调用在主模块中初始化的函数吗?

Can an imported node module call a function which was initialized in the main module?

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

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

boring.js中有一个class叫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 class 实现类似的功能?

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

假设您有一个名为 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 的脚本,并且 return 是它的 export 对象。该脚本在其自己的范围内运行 对导入它的脚本一无所知。因此它不能 查看 main.js
  • 中定义的常量 s
  • 第 2 行:require(模块的 export 对象)的 return 值为 分配给 main.js
  • 中定义的常量 m

关于你的附带问题:

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