console.log("当前模块路径:", __dirname);
console.log("当前模块文件:", __filename);
exports.c = 3;
module.exports = {
a: 1,
b: 2
};
this.m = 5;
console.log(this === exports); false
原因是require函数最终返回的是module.exports,这里的this指向的是最初的module.exports
require函数内部原理大致是:
function require(modulePath) {
//1. 将modulePath转换为绝对路径:D:\repository\NodeJS\源码\myModule.js
//2. 判断是否该模块已有缓存
if(require.cache["D:\\repository\\NodeJS\\源码\\myModule.js"]){
return require.cache["D:\\repository\\NodeJS\\源码\\myModule.js"].result;
}
// //3. 读取文件内容
// //4. 包裹到一个函数中
//这里__dirname, __filename就是temp函数的参数而已
function __temp(module, exports, require, __dirname, __filename) {
console.log("当前模块路径:", __dirname);
console.log("当前模块文件:", __filename);
exports.c = 3;
module.exports = {
a: 1,
b: 2
};
this.m = 5; }
//6. 创建module对象
module.exports = {};
const exports = module.exports;
__temp.call(module.exports, module, exports, require, module.path, module.filename){
return module.exports;
}
require.cache = {};
const result = require("./myModule");
console.log(result);
而代码
module.exports = {
a: 1,
b: 2
};
module.exports被重新赋值了,新开辟了一块内存,所以this不等于现在的module.exports
__dirname, __filename就是require函数内部的一个函数的参数而已,__dirname=module.path, __filename=module.filename,都是module中的一个属性
转载自渡一教育