这个问题近半年看过三次,一直都是迷迷糊糊的,今天看朴大以及一些stack上面的资料终于算是明白点了,先记录一下以避免忘记.javascript
大白话: exports 只是 module.exports 的引用,他们都指向内存中的同一个地址.java
node在加载模块的时候,每一个模块默认有一个module对象,该对象有个属性exports;初始值是空对象{},能够认为require引入模块调用的是module.exports最终指向的对象.node
—-那么怎么理解exports只是module.exports的引用呢.能够这样来看web
var module.exports={},
exports=module.exports; //此时exports 和module.exports指向内存中同一块区域
//咱们导出一个函数当使用exports的时候.像这样:
exports=function(){
console.log('export function');
}
//此时 exports指向的已是内存中另外一块区域了,它已经和module.exports={},赋值的对象没有任何关系,此时他们关系如此密切的两个好基友再无瓜葛。咱们使用require()而后调用会报错。
//这种状况导出就能够工做很好理解,就是给最初的对象增长了一个属性sayHello而已.
exports.sayHello=function(){
console.log('hello');
}
实际上就相似于java中 引用类型 赋值 与修改.svg
在stackoverflow 看到特别6的解释 请看:函数
var module = { exports: {} };
var exports = module.exports;
// your code
return module.exports;
参考资料请点击:
https://cnodejs.org/topic/5231a630101e574521e45ef8ui