#module.exports與exports的區別
對於node執行的每一個js文件,都會自動創建一個module模塊對象,如同一個封閉的函數一樣,把一個函數封閉起來,外部怎樣才能去引用呢?必然需要對完暴露出來一個“門”,也就是暴露出來一個接口。。
module對象會創建一個exports的屬性,初始化的值是一個空的對象,也就是module.exports = {};
打個比方:
有一個nodejs文件叫xxx.js
a = function (){
console.log('a');
}
module.exports={
a:a,
}
exports.a = 1;
另一個js文件叫xxx2.js(引入xxx.js)
var x = require('./xxx');
console.log(x.a);
這里返回的解決必定是a這個函數,而不是1,為什么呢?
首先根據定義來說;
- module.exports 初始值為一個空對象 {}
- require() 返回的是 module.exports 而不是 exports
結合另一篇文章來說 module.exports -》 暴露的對象 《- exports;
本身只想的確是一個對象,
如var b = a; var c = a;
當 var b = ‘1’;
b這個變量已經重新被賦值了,所以和c,a的關系斷裂。因此已經和他們沒有了關系。
同理可知,
本身module.exports -》 暴露的對象 《- exports; 這里相當於 b -》 a 《- c;
當對b重新定義以后,已經不再和a,c有關系。
這就是我理解的區別,
參考文章
https://cnodejs.org/topic/5231a630101e574521e45ef8
https://cnodejs.org/topic/52308842101e574521c16e06
每天一點進步,不求與人,不受限於人。
剩下的是個人扯淡。
此時這三個對應的是不同,a指向一塊內存,理解b和c都是棧內存中一個索引,去指向a所在的那塊內存(這一點抽象,不必理解。)
當 重新 var b = '1'; b就被重新賦值定義了,而不是在棧內存中的一個索引, 直接就去指向一塊內存。