Node.js 中模块上下文中的范围

Scopes in context of Modules in Node.js

本文关键字:范围 上下文 模块 js Node      更新时间:2023-09-26

我需要了解 Node.js 中作用域的概念。事实上,当我尝试下面的代码时,this === global

//basic1.js file
this.bar = "Bacon";

//basic2.js file
require('./basic1');
console.log(this.bar);

并运行 basic2.js,输出是未定义的而不是培根。由于我在全局对象中分配一个属性栏,并且全局对象由所有节点模块共享,为什么我未定义为输出?你能帮我理解一下吗?

要理解节点.js更好地解释模块以查看源代码:

  1. 从文件中读取源代码。
  2. function(exports, require, module, __dirname, __filename){ /* source code */ }一样将源代码包装到函数调用中
  3. 将包装的代码评估到 v8 虚拟机中(类似于浏览器中的 eval 函数)并获取函数。
  4. 调用上一步中的函数,使用 exports 覆盖this上下文。

简化代码:

var code = fs.readFileSync('./module.js', 'utf-8');
var wrappedCode = `function (exports, require, module, __dirname, __filename) {'n${code}'n}`;
var exports = {};
var fn = vm.runInThisContext(wrappedCode);
var otherArgs = [];
// ... put require, module, __dirname, __filename in otherArgs
fn.call(exports, exports, ...otherArgs);