溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

nodejs中exports與module.exports的區(qū)別是什么

發(fā)布時(shí)間:2021-01-22 16:00:12 來(lái)源:億速云 閱讀:161 作者:Leah 欄目:web開發(fā)

nodejs中exports與module.exports的區(qū)別是什么?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

app.js

var a = {name: 'nswbmw 1'};
var b = a;
console.log(a);
console.log(b);
b.name = 'nswbmw 2';
console.log(a);
console.log(b);
var b = {name: 'nswbmw 3'};
console.log(a);
console.log(b);

運(yùn)行 app.js 結(jié)果為:

{ name: 'nswbmw 1' }
{ name: 'nswbmw 1' }
{ name: 'nswbmw 2' }
{ name: 'nswbmw 2' }
{ name: 'nswbmw 2' }
{ name: 'nswbmw 3' }

解釋一下:a 是一個(gè)對(duì)象,b 是對(duì) a 的引用,即 a 和 b 指向同一個(gè)對(duì)象,即 a 和 b 指向同一塊內(nèi)存地址,所以前兩個(gè)輸出一樣。當(dāng)對(duì) b 作修改時(shí),即 a 和 b 指向同一塊內(nèi)存地址的內(nèi)容發(fā)生了改變,所以 a 也會(huì)體現(xiàn)出來(lái),所以第三、四個(gè)輸出一樣。當(dāng)對(duì) b 完全覆蓋時(shí),b 就指向了一塊新的內(nèi)存地址(并沒(méi)有對(duì)原先的內(nèi)存塊作修改),a 還是指向原來(lái)的內(nèi)存塊,即 a 和 b 不再指向同一塊內(nèi)存,也就是說(shuō)此時(shí) a 和 b 已毫無(wú)關(guān)系,所以最后兩個(gè)輸出不一樣。

明白了上述例子后,我們進(jìn)入正題。

我們只需知道三點(diǎn)即可知道 exports 和 module.exports 的區(qū)別了:

  • exports 是指向的 module.exports 的引用

  • module.exports 初始值為一個(gè)空對(duì)象 {},所以 exports 初始值也是 {}

  • require() 返回的是 module.exports 而不是 exports

所以:我們通過(guò)

var name = 'nswbmw';
exports.name = name;
exports.sayName = function() {
 console.log(name);
}

給 exports 賦值其實(shí)是給 module.exports 這個(gè)空對(duì)象添加了兩個(gè)屬性而已,上面的代碼相當(dāng)于:

var name = 'nswbmw';
module.exports.name = name;
module.exports.sayName = function() {
 console.log(name);
}

我們通常這樣使用 exports 和 module.exports

一個(gè)簡(jiǎn)單的例子,計(jì)算圓的面積:

使用 exports

app.js

var circle = require('./circle');
console.log(circle.area(4));

circle.js

exports.area = function(r) {
 return r * r * Math.PI;
}

使用 module.exports

app.js

var area = require('./area');
console.log(area(4));

area.js

module.exports = function(r) {
 return r * r * Math.PI;
}

上面兩個(gè)例子輸出是一樣的。你也許會(huì)問(wèn),為什么不這樣寫呢?

app.js

var area = require('./area');
console.log(area(4));

area.js

exports = function(r) {
 return r * r * Math.PI;
}

運(yùn)行上面的例子會(huì)報(bào)錯(cuò)。這是因?yàn)?,前面的例子中通過(guò)給 exports 添加屬性,只是對(duì) exports 指向的內(nèi)存做了修改,而

exports = function(r) {
 return r * r * Math.PI;
}

其實(shí)是對(duì) exports 進(jìn)行了覆蓋,也就是說(shuō) exports 指向了一塊新的內(nèi)存(內(nèi)容為一個(gè)計(jì)算圓面積的函數(shù)),也就是說(shuō) exports 和 module.exports 不再指向同一塊內(nèi)存,也就是說(shuō)此時(shí) exports 和 module.exports 毫無(wú)聯(lián)系,也就是說(shuō) module.exports 指向的那塊內(nèi)存并沒(méi)有做任何改變,仍然為一個(gè)空對(duì)象 {} ,也就是說(shuō) area.js 導(dǎo)出了一個(gè)空對(duì)象,所以我們?cè)?app.js 中調(diào)用 area(4) 會(huì)報(bào) TypeError: object is not a function 的錯(cuò)誤。

所以,一句話做個(gè)總結(jié):當(dāng)我們想讓模塊導(dǎo)出的是一個(gè)對(duì)象時(shí),exports 和 module.exports 均可使用(但 exports也不能重新覆蓋為一個(gè)新的對(duì)象),而當(dāng)我們想導(dǎo)出非對(duì)象接口時(shí),就必須也只能覆蓋 module.exports。

我們經(jīng)??吹竭@樣的用寫法:

exports = module.exports = somethings;

上面的代碼等價(jià)于

module.exports = somethings;
exports = module.exports;

原因也很簡(jiǎn)單,module.exports = somethings 是對(duì) module.exports 進(jìn)行了覆蓋,此時(shí) module.exports 和 exports 的關(guān)系斷裂,module.exports 指向了新的內(nèi)存塊,而 exports 還是指向原來(lái)的內(nèi)存塊,為了讓 module.exports 和 exports 還是指向同一塊內(nèi)存或者說(shuō)指向同一個(gè) “對(duì)象”,所以我們就 exports = module.exports。

關(guān)于nodejs中exports與module.exports的區(qū)別是什么問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI