关于Node
中的this
===exports
- 在测试模块
myModule.js
中写入:
this.m = 5;
exports.c = 3
module.exports = {
a: 1,
b: 2
}
- 在
index.js
模块中引入myMoule.js
模块
const res = require('./myModule')
console.log(res);
- 输出以下内容:
{ a: 1, b: 2 }
-
再将
myModule.js
中的内容替换为:exports.c = 3 module.exports.a = 1; module.exports.b = 2; this.m = 5;
- 此时输出:
{ c: 3, a: 1, b: 2, m: 5 }
这一现象,要从模块使用
require
开始说起:当执行一个模块或使用
require
时,会将模块放置在一个函数环境中,然后运行一下几个步骤:function require(modulePath){ // 1. 将modulePath转化为绝对路径 // 2. 通过require.cache对象判断该模块是否有缓存 if(require.cache['绝对路径']){ // 如果有缓存,则直接返回模块的运行结果 returm require.cache['绝对路径'].result; } // 3. 如果没有缓存,则读取文件内容,并将读取完的文件内容包裹到一个函数环境中 function __temp(module, exports, require, __dirname, __filename){ exports.c = 3 module.exports.a = 1; module.exports.b = 2; this.m = 5; } // 4. 创建module对象 module.exports = {}; let exports = module.exports; // 5. 将各个实参传入到__temp函数中 __temp.call(module.export, module, exports, require, module.path, module.filename); // 6. return module.exports; }
由第五步可知,在模块文件包裹的函数中,
this
的指向为module.exports
;由第四步可知,
module.exoprts
和exports
两个引用值指向同一个地址;综上可知,在__temp函数中,
this === exports === module.exports
;所以当第一次在测试模块中写:
module.exports = {a :1,b:2}
时,实际上是将module.exports
给重新赋值了,它的指针指向和this
、exports
不再相同。