exports和module.exports的区别——学习笔记

一开始,exportsmodule.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)

 

 

原文地址:https://www.cnblogs.com/JhonFlame/p/7999807.html