module.exports与exports的关系和区别

module.exports与exports的关系和区别

在Node中,很多新手都会有一个疑惑,module.exports和exports到底什么关系呢?实际上我们该用哪一个呢?

理想情况下,我们只要赋值exports即可:

exports = function(){
    //code
}

但是通过上面代码,我们通常都是得到一个错误的结果。这是因为exports对象是通过形参的形式传入的,直接赋值的话可能会改变形参的引用,并不能改变作用域外的值。

接下来我们来举个例子:

var a = {
  color: "white"
};
var b = a;

console.log(a);//{ color: 'white' }
console.log(b);//{ color: 'white' }

b.color = "red";

console.log(a);//{ color: 'red' }
console.log(b);//{ color: 'red' }


b = {
  name: "test"
};

console.log(a);//{ color: 'red' }
console.log(b);//{ name: 'test' }

在这里b是对a的引用,它们都指向同一块内存,因此改变了b的属性等于改变了a的属性。再者,我们通过赋值为b = {name: “test”}以后,发现b指向了一块新的内存,因此两者输出的都不一样了。

通过上面例子,这也就不难发现为什么我们用exports 和 module.exports会有出入。

总结起来,exports 和 module.exports 二者的关系:
module.exports 初始值为一个空对象 {},而exports为指向module.exports 的引用,同时在require() 的时候,返回的是 module.exports 而不是 exports,因此,直接赋值exports常常会出现错误,而赋值为module.exports常常是解决这一问题的折中办法。

另外,我们也经常看到这样的写法:

exports = module.exports = xxx //code

即:

module.exports = xxx //code
exports = module.exports;

这种办法的实现其实就是赋值module.exports后不忘把exports也同时指向这块新内存了。即module.exports指向新对象以后,exports断开了对module.exports的引用,后面的做法主要是让exports重新指向module.exports。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值