我编写了一个模块来包含我正在处理的大型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.js
和module.js
中都需要它