导入的节点模块可以调用在主模块中初始化的函数吗?
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.js
和 module.js
中都需要它
我写了一个模块来包含我正在处理的大型 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
中定义的常量 - 第 2 行:require(模块的
export
对象)的 return 值为 分配给main.js
中定义的常量
s
m
关于你的附带问题:
- 您可以将
log
对象作为参数传递给定义的函数 里面module.js
- 您可以在第三个模块中定义
log
并在main.js
和module.js
中都需要它