這個問題近半年看過三次,一直都是迷迷糊糊的,今天看樸大以及一些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