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

时间:2016-07-14 10:32:42

标签: javascript node.js

我需要了解Node.js中范围的概念。当我尝试下面的代码时this === global的事实

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


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

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

1 个答案:

答案 0 :(得分:0)

要了解node.js如何更好地解释模块以查看source code

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

    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);