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



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

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

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

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

当我试图从驻留在boring.js中的函数内部调用log.save(newLogMsg)时,我会得到错误:

ReferenceError: log is not defined

这让我很困惑,因为let log = new Log是在我调用位于导入模块内的有问题的函数(来自main.js(之前在主模块中初始化的。

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

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

假设您有一个名为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的脚本返回其CCD_ 25对象。脚本在自己的作用域中运行了解正在导入的脚本的任何信息。因此它不能参见main.js中定义的常数s
  • 第2行:require(模块的export对象(的返回值为分配给main.js内部定义的常数CCD_ 29

关于你的附带问题:

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

最新更新