exports与modeule.exports的区别

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

先举个简单的例子:

1
2
3
4
5
var a = {name:'cxy'};
var b = a;
console.log(a); // {name: "cxy"}
console.log(b); // {name: "cxy"}

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

1
2
3
4
b.name = 'wxm';
console.log(a); // {name: "wxm"}
console.log(b); // {name: "wxm"}

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

1
2
3
4
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 还是指向原来的内存,所以最后输出会不一样。

那么此时就可以引出exports和module.exports了:
1、module.exports 初始值为一个空对象 {}
2、exports 是指向的 module.exports 的引用
3、require() 返回的是 module.exports 而不是 exports
如果module.exports发生了新指向,则exports无效;若module.exports没有发生变化,则直接exports即可。