可能有人见过直接使用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"}
这三个例子输出了三种结果:
- 声明a对象,并把a赋值给b,然后a和b输出了相同的结果;
- 改变了b中的name,那么a中的name也跟着改变;
- 重新声明了b对象,那么a中的name则没有跟着b一起改变
解释:a 是一个对象,b 是对 a 的引用,即 a 和 b 指向同一块内存,所以1中的输出是一样的。当对 b 作修改时,即 a 和 b 指向同一块内存地址的内容发生了改变,a 也会体现出来,所以第2个例子输出也一样。当 b 被覆盖时,b 指向了一块新的内存,a 还是指向原来的内存,所以最后输出会不一样。
那么此时就可以引出exports
和module.exports
了:
- module.exports 初始值为一个空对象 {}
- exports 是指向的 module.exports 的引用
- require() 返回的是 module.exports 而不是 exports
如果module.exports发生了新指向,则exports无效;若module.exports没有发生变化,则直接exports即可。