EXPORTS与MODULE.EXPORTS的区别

可能有人见过直接使用exports的,有的是使用module.exports的,这里稍微的讲解下这两者的区别。

先举个简单的例子:

var a = {name:'cxy'};
var b = a;

console.log(a); // {name: "cxy"}
console.log(b); // {name: "cxy"}  

a和b输出的结果是一样的。现在我改变下b中name的值:

b.name = 'wxm';

console.log(a); // {name: "wxm"}
console.log(b); // {name: "wxm"}  

a和b的输出结果都发生了改变。我再对b进行重新声明:

var b = {name:'js'};

console.log(a); // {name: "wxm"}
console.log(b); // {name: "js"}  

这三个例子输出了三种结果:

  1. 声明a对象,并把a赋值给b,然后a和b输出了相同的结果;
  2. 改变了b中的name,那么a中的name也跟着改变;
  3. 重新声明了b对象,那么a中的name则没有跟着b一起改变

解释:a 是一个对象,b 是对 a 的引用,即 a 和 b 指向同一块内存,所以1中的输出是一样的。当对 b 作修改时,即 a 和 b 指向同一块内存地址的内容发生了改变,a 也会体现出来,所以第2个例子输出也一样。当 b 被覆盖时,b 指向了一块新的内存,a 还是指向原来的内存,所以最后输出会不一样。

那么此时就可以引出exportsmodule.exports了:

  1. module.exports 初始值为一个空对象 {}
  2. exports 是指向的 module.exports 的引用
  3. require() 返回的是 module.exports 而不是 exports

如果module.exports发生了新指向,则exports无效;若module.exports没有发生变化,则直接exports即可。

原文地址:https://www.cnblogs.com/Nick-chen/p/6872118.html