关于Node中的this===exports

关于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.exoprtsexports两个引用值指向同一个地址;

    综上可知,在__temp函数中,this === exports === module.exports

    所以当第一次在测试模块中写:module.exports = {a :1,b:2}时,实际上是将module.exports给重新赋值了,它的指针指向和thisexports不再相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值