nodejs里的module.exports和exports

在node.js中我們可以使用module.exports和exports導出模塊,設置導出函數、數組、變量等等

為什么可以用這兩個模塊?

或者直接問,node.js的模塊功能是怎么實現的。
這樣得益于javascript是函數性的語言,并支持閉包。

js的閉包

直接看w3cschool吧,感覺講的挺好的:js閉包

node.js的模塊實現,大致代碼

首先準備一個nodejs規范的代碼:
hello.js

var s = 'Hello';
var name = 'world';console.log(s + ' ' + name + '!');

Node.js加載了hello.js后,它把這段代碼包裝一下,大概變成這樣:

var module = {id: 'hello',exports: {}
};
var load = function () {// 實際我們自己編寫的hello.js代碼:function greet(name) {console.log('Hello, ' + name + '!');}module.exports = greet;// hello.js代碼結束return module.exports;
};
var exports = load();
// 保存module:
save(module, exports);

module是nodejs自動加的一個對象,可見,初始化的時候會先對module.exports賦值一個空的對象{}。

save(module, exports);這個函數是個真·全局函數,作用是把exports這個變量存到某個全局變量中。其它模塊通過require()函數實際上就是去這個全局變量里把對應的值拿出來。

這樣,看js代碼大概就明白了,為什么在nodejs里可以直接用module.exports和exports這兩個語法。

module.exports和exports

module.exports和exports實際上都是對一個對象的引用,這個對象初始化就是一個空對象{}。所以直接就可以使用類似

示例一:
module.exports.foo = function () { return 'foo'; };
module.exports.bar = function () { return 'bar'; };
或者示例二:
exports.foo = function () { return 'foo'; };
exports.bar = function () { return 'bar'; };

這兩個示例作用是一樣的,其本質都是往最開始初始化的空數組里添加成員。

示例三
module.exports = {hello: hello,greet: greet
};

示例三就不一樣了,實際上module.exports重新引用到了一個新的對象里。如果示例三前面有示例一或者二的代碼,那么會最終導致示例一或者二導出的模塊丟掉。

示例四
exports = {hello: hello,greet: greet
};

示例四看上去雖然和示例三差不多,但是這種寫法實際上并沒有輸出任何變量!注意看nodejs的實現代碼,load()函數里最后return的是module.exports,也就是說最后save的是module.exports的引用對象,而示例四中exports被賦值了一個新的對象,此時module.exports和exports引用的已經不是同一個對象了!

那么提問:示例三雖然對module.exports重新引用到了一個新的對象,最終結果也能實現模塊的正常導出,那么示例三里的exports此時引用的是什么對象呢?

最后,如果你打算導出一個數組或者變量,或者函數,都會涉及到module.exports原引用對象的丟棄,要額外注意,此時要小心不要丟掉前面已經導出的模塊。

結論

如果要輸出一個鍵值對象{},可以利用exports這個已存在的空對象{},并繼續在上面添加新的鍵值;

如果要輸出一個函數或數組,必須直接對module.exports對象賦值。

所以我們可以得出結論:直接對module.exports賦值,可以應對任何情況:

module.exports = {foo: function () { return 'foo'; }
};
或者:
module.exports = function () { return 'foo'; };

最終,我們強烈建議使用module.exports = xxx的方式來輸出模塊變量,這樣,你只需要記憶一種方法。

或者使用我喜歡的方法,對空對象直接添加值:

var foo = function () { return 'foo'; };...module.exports.foo = foo;//
module.exports.bar = function () { return 'bar'; };

參考

liaoxuefeng

exports 和 module.exports 的區別

w3cschool

JS是按值傳遞還是按引用傳遞?,但是我不是很同意文中所說的按共享傳遞這名字的叫法。實際上無論傳遞普通變量還是傳遞函數,都是按值拷貝傳遞,只不過傳遞對象的時候,拷貝過去的是個引用變量罷了,即引用副本。
這里就是c語言指針的思想。

如果你對我上面所講的還不明白,建議去把c語言里的指針好好的重學一遍。真正理解透徹了c里面的指針,學起來其它所有語言都不怕。

轉載于:https://www.cnblogs.com/acbingo/p/7709363.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454305.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454305.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454305.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言貪吃蛇最簡單代碼_C語言指針,這可能是史上最干最全的講解啦(附代碼)!!!...

點擊上方“大魚機器人”,選擇“置頂/星標公眾號”福利干貨,第一時間送達!指針對于C來說太重要。然而,想要全面理解指針,除了要對C語言有熟練的掌握外,還要有計算機硬件以及操作系統等方方面面的基本知識。所…

SpringSecurity深度解析與實踐(3)

這里寫自定義目錄標題 引言SpringSecurity之授權授權介紹java權限集成 登錄失敗三次用戶上鎖 引言 SpringSecurity深度解析與實踐(2)的網址 SpringSecurity之授權 授權介紹 Spring Security 中的授權分為兩種類型: 基于角色的授權&#…

簡單解釋什么是 依賴注入 和 控制反轉

簡單解釋什么是 依賴注入 和 控制反轉2017-07-09 關于 依賴注入 與 控制反轉 的概念有些人覺得很難理解,最近在給別人講這個概念的時候梳理了一個比較好理解的解釋,而且我認為非技術人員也應該能聽的懂,因此分享給大家,希望下次你…

python pip install指定國內源鏡像

有時候安裝一些依賴包,網不好,直接超時,或者這個包就是死都下不下來的時候,可以指定國內源鏡像。 pip install -i 國內鏡像地址 包名 清華:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirr…

機器學習之單標簽多分類及多標簽多分類

單標簽二分類算法 Logistic算法 單標簽多分類算法 Softmax算法 One-Versus-One(ovo):一對一 One-Versus-All / One-Versus-the-Rest(ova/ovr): 一對多 ovo和ovr的區別 Error Correcting Output code…

ionic3 隱藏子頁面tabs

看了幾天ionic3 問題還挺多的,今天想把所有子頁面tabs 給去掉,整了半天,發現app.Module 是可以配置的 修改 IonicModule.forRoot(MyApp) imports: [BrowserModule,// IonicModule.forRoot(MyApp),HttpModule,IonicModule.forRoot(…

cas單點登錄-jdbc認證(三)

前言 本節的內容為JDBC認證,查找數據庫進行驗證,其中包括: 密碼加密策略(無密碼,簡單加密,加鹽處理)認證策略(jdbc)一、業務需求 不同的公司,需求業務需求或者…

get clone 出現 fatal: the remote end hung up unexpectedly5 MiB | 892.00 KiB/s 報錯信息

fatal: the remote end hung up unexpectedly5 MiB | 892.00 KiB/s 解決方案 (親測有效) 解決方案如下: git clone時加上 --depth1,比如: git clone https://gitee.com/songyitian/tctm.git --depth 1depth用于指定…

mybatis foreach map_重學Mybatis(六)-------輸入映射(含面試題)

博主將會針對Java面試題寫一組文章,包括J2ee,SQL,主流Web框架,中間件等面試過程中面試官經常問的問題,歡迎大家關注。一起學習,一起成長,文章底部有面試題。入參映射關鍵字說明圖中paramenterTy…

php輸出多余的空格或者空行

1&#xff0c;文件是否有bom。可以通過腳步檢測&#xff0c;或者利用notepa打開&#xff0c;查看編碼格式。 2. <?php echo something; ?> 或許是你的php標簽外&#xff0c;有空格或者空行。一般的項目都是用框架&#xff0c;包含很多的文件&#xff0c;如果一個個文…

執行git命令時出現fatal: ‘origin‘ does not appear to be a git repository錯誤

執行git命令時出現fatal: ‘origin’ does not appear to be a git repository錯誤 在執行git pull origin master時出現&#xff1a;   fatal: ‘origin’ does not appear to be a git repository   致命提示:“origin”看起來不是一個git存儲庫   fatal: Could not r…

蔣濤作序盛贊Leo新作為“程序員職場實用百科全書”——《程序員羊皮卷》連載(1)

《程序員羊皮卷》當當購買地址&#xff1a;http://product.dangdang.com/product.aspx?product_id20691986 互動購買地址&#xff1a;http://www.china-pub.com/196049 程序員行業從外面看起來有很多絢麗的光環&#xff0c;這里有無數以程序致富的天才&#xff0c;世界首富比…

matlab ones函數_Matlab中相見恨晚的命令(持續更新)

知乎上有個“有哪些讓人相見恨晚的Matlab命令”的話題&#xff0c;很多答主提供的命令確實很實用&#xff0c;為了更方便大家的學習&#xff0c;我就知乎上的答案和我自己想到的都綜合整理成了一篇文章&#xff0c;把我覺得很實用的指令整理出來。知乎原答案鏈接dbstop if erro…

機器學習之特征工程

特征工程-概念 特征工程是一個面向十分廣的概念&#xff0c;只要是在處理數據就可以認為是在做特征工程。個人理解&#xff0c;真正意義上的特征工程還是數據降維和數據升維的過程。 而前期對數據的處理過程&#xff1a; 需要哪些數據&#xff1f;數據如何存儲&#xff1f;數…

ArcGIS AO開發高亮顯示某些要素

參考代碼1 ifeaturecursor pcur ifeatureclass.search(iqueryfilter pfilter); pfilter.whereclause strAddress; //輸入查詢條件&#xff0c;也就是你寸地址的字段名didian ifeature pfeat pcur.nextfeature();// 如果pCur多個要素&#xff0c;則可以考慮將其合并并一起高亮…

Oracle傳輸表空間介紹

傳輸表空間通過拷貝數據文件的方式&#xff0c;實現可跨平臺的數據遷移&#xff0c;效率遠超expdp/impdp, exp/imp等工具。還可以應用跨平臺&數據庫版本遷移表數據、歸檔歷史數據和實現表空間級時間點數據恢復等場景。轉載于:https://www.cnblogs.com/ilifeilong/p/7712654…

git push到GitHub的時候遇到! [rejected] master -> master (non-fast-forward)的問題

git push到GitHub的時候遇到! [rejected] master -> master (non-fast-forward)的問題 解決方法&#xff1a; 1、git pull origin master --allow-unrelated-histories //把遠程倉庫和本地同步&#xff0c;消除差異 2、重新add和commit相應文件 3、git push origin maste…

程序員考核的五大死因(上)

程序員作為企業開發力量的最核心資產&#xff0c;無疑得到公司從上至下的一致關注。開發是個智力密集型產業&#xff0c;程序開發的特點是&#xff0c;付出相同時間的情況下&#xff0c;兩個開發者之間的產能會相差十幾甚至幾十倍。軟件開發人員向來以“不容易考核、工作不容易…

du -sh 如何找到最大的文件夾_小白必看!手把手教你如何在linux上安裝redis數據庫...

首先我們要清楚redis是什么&#xff1f;redis是一種非關系型數據庫&#xff0c;它與MySQL的這種關系型數據庫不同&#xff0c;MySQL是將數據存儲在磁盤中&#xff0c;而redis是儲存在內存中。一般很多公司都是使用MySQLredis兩種數據存儲方式&#xff0c;這樣可以提高性能&…

Linux刪除特殊字符文件

1.刪除帶“-”的文件名的方法使用-- &#xff08;2個橫杠&#xff09;#touch -- -%F-%T#rm -- -%F-%Trm: remove regular empty file -%F-%T?使用絕對路徑并TAB特殊文件名#rm /root/-%F-%Trm: remove regular empty file /root/-%F-%T?2. 刪除包含其它特殊字符的文件對于含有…