require 用來加載代碼,而 exports 和 module.exports 則用來導出代碼。但很多新手可能會迷惑于 exports 和 module.exports 的區別,為了更好的理解 exports 和 module.exports 的關系,我們先來鞏固下 js 的基礎。示例:
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);運行 app.js 結果為:
{ name: 'nswbmw 1' }{ name: 'nswbmw 1' }{ name: 'nswbmw 2' }{ name: 'nswbmw 2' }{ name: 'nswbmw 2' }{ name: 'nswbmw 3' }解釋一下:a 是一個對象,b 是對 a 的引用,即 a 和 b 指向同一個對象,即 a 和 b 指向同一塊內存地址,所以前兩個輸出一樣。當對 b 作修改時,即 a 和 b 指向同一塊內存地址的內容發生了改變,所以 a 也會體現出來,所以第三、四個輸出一樣。當對 b 完全覆蓋時,b 就指向了一塊新的內存地址(并沒有對原先的內存塊作修改),a 還是指向原來的內存塊,即 a 和 b 不再指向同一塊內存,也就是說此時 a 和 b 已毫無關系,所以最后兩個輸出不一樣。
明白了上述例子后,我們進入正題。
我們只需知道三點即可知道 exports 和 module.exports 的區別了:
exports 是指向的 module.exports 的引用 module.exports 初始值為一個空對象 {},所以 exports 初始值也是 {} require() 返回的是 module.exports 而不是 exports所以:我們通過
var name = 'nswbmw';exports.name = name;exports.sayName = function() { console.log(name);}給 exports 賦值其實是給 module.exports 這個空對象添加了兩個屬性而已,上面的代碼相當于:
var name = 'nswbmw';module.exports.name = name;module.exports.sayName = function() { console.log(name);}我們通常這樣使用 exports 和 module.exports
一個簡單的例子,計算圓的面積:
使用 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;}上面兩個例子輸出是一樣的。你也許會問,為什么不這樣寫呢?
app.js
var area = require('./area');console.log(area(4));area.js
exports = function(r) { return r * r * Math.PI;}運行上面的例子會報錯。這是因為,前面的例子中通過給 exports 添加屬性,只是對 exports 指向的內存做了修改,而
新聞熱點
疑難解答
圖片精選