EXPORTS与MODULE.EXPORTS的区别

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

先举个简单的例子:java

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

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

a和b输出的结果是同样的。如今我改变下b中name的值:ui

b.name = 'wxm';

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

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

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 仍是指向原来的内存,因此最后输出会不同。blog

那么此时就能够引出exportsmodule.exports了:ip

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

若是module.exports发生了新指向,则exports无效;若module.exports没有发生变化,则直接exports便可。内存

相关文章
相关标签/搜索