EXPORTS與MODULE.EXPORTS的區別

可能有人見過直接使用exports的,有的是使用module.exports的,這裏稍微的講解下這二者的區別。javascript

先舉個簡單的例子:java

var a = {name:'cxy'};
var b = a;

console.log(a); // {name: "cxy"}
console.log(b); // {name: "cxy"}  

a和b輸出的結果是同樣的。如今我改變下b中name的值:ui

b.name = 'wxm';

console.log(a); // {name: "wxm"}
console.log(b); // {name: "wxm"}  

a和b的輸出結果都發生了改變。我再對b進行從新聲明:code

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 仍是指向原來的內存,因此最後輸出會不同。blog

那麼此時就能夠引出exportsmodule.exports了:ip

  1. module.exports 初始值爲一個空對象 {}
  2. exports 是指向的 module.exports 的引用
  3. require() 返回的是 module.exports 而不是 exports

若是module.exports發生了新指向,則exports無效;若module.exports沒有發生變化,則直接exports便可。內存

相關文章
相關標籤/搜索