node.js中module.exports與exports的區別

Node.js 引入了模塊(Module)概念,一個模塊能夠經過module.exports 或 exports 將函數、變量等導出,以使其它 JavaScript 腳本經過require() 函數引入並使用。 javascript

module.exports 初始值爲一個空對象 {},因此 exports 初始值也是 {},exports 是指向的 module.exports 的引用,在模塊內部大概是這樣:java

exports = module.exports = {}; 

舉個栗子,在node.js中建立模塊很是簡單,一個文件就是一個模塊,因此咱們建立一個name.js文件就建立了一個模塊name.js,使用exports和require對象對外提供接口和引用模塊。node

name.jsapp

var myName=function(){
    var name='AmberYLopez';
        console.log(name);
};
exports.myName=myName;

這樣在使用的時候須要這樣函數

app.jsui

var name=require('./name');

 

若是咱們建立的name.js文件是使用module.exports和require對象對外提供接口和引用模塊。spa

name.js code

var myName=function(){
    var name='AmberYLopez';
        console.log(name);
};
module.exports=myName;

app.js對象

var name=require('./name');

exports 賦值實際上是給 module.exports 這個空對象添加myName屬性而已,爲何exports要使用添加屬性的方式,而不用exports=myName?blog

exports是引用 module.exports的值。exports 被改變的時候,module.exports不會被改變,而模塊導出的時候,真正導出的執行是module.exports,而不是exports。

若是將name.js改成

var myName=function(){
    var name='AmberYLopez';
        console.log(name);
};
exports=myName;

app.js

var name=require('./name');
console.log(name);

  

運行會報錯。由於,前面是經過給 exports 添加屬性,而如今對 exports 指向的內存作了修改,exports 和  module.exports 再也不指向同一塊內存,即 module.exports 指向的那塊內存並無作任何改變,仍然爲一個空對象 {},因此會報錯。

相關文章
相關標籤/搜索