国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

詳談commonjs模塊與es6模塊的區別

2024-05-06 15:25:30
字體:
來源:轉載
供稿:網友

到目前為止,已經實習了3個月的時間了。最近在面試,在面試題里面有題目涉及到模塊循環加載的知識。趁著這個機會,將commonjs模塊與es6模塊之間一些重要的的區別做個總結。語法上有什么區別就不具體說了,主要談談引用的區別。

commonjs

對于基本數據類型,屬于復制。即會被模塊緩存。同時,在另一個模塊可以對該模塊輸出的變量重新賦值。

對于復雜數據類型,屬于淺拷貝。由于兩個模塊引用的對象指向同一個內存空間,因此對該模塊的值做修改時會影響另一個模塊。

當使用require命令加載某個模塊時,就會運行整個模塊的代碼。

當使用require命令加載同一個模塊時,不會再執行該模塊,而是取到緩存之中的值。也就是說,commonjs模塊無論加載多少次,都只會在第一次加載時運行一次,以后再加載,就返回第一次運行的結果,除非手動清除系統緩存。

循環加載時,屬于加載時執行。即腳本代碼在require的時候,就會全部執行。一旦出現某個模塊被"循環加載",就只輸出已經執行的部分,還未執行的部分不會輸出。

ES6模塊

es6模塊中的值屬于【動態只讀引用】。

對于只讀來說,即不允許修改引入變量的值,import的變量是只讀的,不論是基本數據類型還是復雜數據類型。當模塊遇到import命令時,就會生成一個只讀引用。等到腳本真正執行時,再根據這個只讀引用,到被加載的那個模塊里面去取值。

對于動態來說,原始值發生變化,import加載的值也會發生變化。不論是基本數據類型還是復雜數據類型。

循環加載時,

上面說了一些重要區別。現在舉一些例子來說明每一點吧

commonjs

對于基本數據類型,屬于復制。即會被模塊緩存。同時,在另一個模塊可以對該模塊輸出的變量重新賦值。

// b.jslet count = 1let plusCount = () => { count++}setTimeout(() => { console.log('b.js-1', count)}, 1000)module.exports = { count, plusCount}// a.jslet mod = require('./b.js')console.log('a.js-1', mod.count)mod.plusCount()console.log('a.js-2', mod.count)setTimeout(() => { mod.count = 3 console.log('a.js-3', mod.count)}, 2000)node a.jsa.js-1 1a.js-2 1b.js-1 2 // 1秒后a.js-3 3 // 2秒后

以上代碼可以看出,b模塊export的count變量,是一個復制行為。在plusCount方法調用之后,a模塊中的count不受影響。同時,可以在b模塊中更改a模塊中的值。如果希望能夠同步代碼,可以export出去一個getter。

// 其他代碼相同module.exports = { get count () { return count }, plusCount}node a.jsa.js-1 1a.js-2 1b.js-1 2 // 1秒后a.js-3 2 // 2秒后, 由于沒有定義setter,因此無法對值進行設置。所以還是返回2            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 佛冈县| 阳城县| 西畴县| 蒙阴县| 逊克县| 衡东县| 尤溪县| 嵩明县| 土默特左旗| 西平县| 离岛区| 迁安市| 瑞昌市| 泌阳县| 邹平县| 荥经县| 盐亭县| 威信县| 东明县| 克什克腾旗| 林口县| 富川| 沅江市| 新昌县| 双柏县| 新丰县| 余江县| 抚远县| 休宁县| 三门峡市| 资兴市| 凤凰县| 宝丰县| 南和县| 岚皋县| 南安市| 沙坪坝区| 长垣县| 瑞金市| 吴江市| 漯河市|