一開始,exports和module.exports都指向空對象(同一內存塊),exports是引用 module.exports的值。module.exports 被改變的時候,exports不會被改變,而模塊導出的時候,真正導出的執行是module.exports,而不是exports
/*app.js*/ var s = require("./log"); s.log("hello");
//log.js exports.log =function (str) { console.log(str); }
//log.js module.exports =function (str) { console.log(str); }
上述兩種用法都沒問題,但如果這樣使用
exports = function (str) { console.log(str); }
前面的例子只是給 exports指向的對象添加屬性,只是對 exports 指向的內存做了修改,內存指向並未發生改變。而上例則是對exports指向的內存進行了覆蓋,使exports指向了一塊新的內存,這樣,exports和module.exports指向的內存並不是同一塊,exports和module.exports並無任何關系。exports指向的內存有了變化,而module.exports指向的內存並無變化,仍為空對象{}。
//app.js var x = require('./init'); console.log(x.a)
//init.js module.exports = {a: 2}//通過賦值的方式指向了另一塊內存 exports.a = 1 //只是在原來指向的內存中添加屬性,內存指向並沒有變化
運行app.js會有輸出
2
這也就是module.exports對象不為空的時候exports對象就自動忽略,因為module.exports通過賦值方式已經和exports對象指向的變量不同了,exports對象怎么改和module.exports對象沒關系了。(真正導出的執行是module.exports)
