我是 NodeJS(版本 v21.6.1)的初学者,我尝试在多个模块中实现代码来理解 JavaScript 中的副作用概念,但代码不起作用,为什么?
// main.js
import './bootstrap.js';
console.log(` >>>>>>>>>>>>>> ${globalThis.someFunctionDep}`);
// >>>>>>>>>>>>>> undefined
globalThis.someFunctionDep = true;
import './someModule.js';
// bootstrap.js
export default () => {
globalThis.someFuncitonDep = false;
console.log("??????????????????");
}
// someModule.js
if (!Object.hasOwn(globalThis, "someFuncitonDep") || !globalThis.someFuncitonDep) {
throw 'globalThis.someFunctionDep is not set';
}
我认为您期望在代码中达到
import
声明时发生导入。 JavaScript 模块不是这样工作的。相反,模块依赖关系是通过查看互连模块中的所有 import
和 export
声明来“静态”确定的,然后加载模块并按照生成的模块图的适当顺序执行其代码。模块中的 import
声明与这些模块中的分步代码无关。
您的main.js
代码在功能上等同于:
import './bootstrap.js';
import './someModule.js';
console.log(` >>>>>>>>>>>>>> ${globalThis.someFunctionDep}`);
// >>>>>>>>>>>>>> undefined
globalThis.someFunctionDep = true;
bootstrap.js
和
someModule.js
的顶级代码都会在
main.js
的顶级代码之前执行(因为不存在循环关系;当存在循环关系时,情况会变得更加复杂)。另外,在 someModule.js
的 hasOwn
检查中,您将
someFunctionDep
错误拼写为 someFuncitonDep
。