exports与module.exports区别

·  阅读 45

其实说起两者的区别也很简单 ,今天这个只是给自己和刚开始node的新手解释,大佬们不喜勿喷啊。

exports和module.exports区别

  • 解释之前先铺一个小例子

    var a ={name:'lihua'};
    var b = a;
    
    console.log(a);
    console.log(b);
    
    b.name = 'zhangsan';
    console.log(a);
    console.log(b);
    
    var b= {name:'lisi'};
    console.log(a);
    console.log(b)
    复制代码
    //结果
    { name: 'lihua' }
    { name: 'lihua' }
    { name: 'zhangsan' }
    { name: 'zhangsan' }
    { name: 'zhangsan' }
    { name: 'lisi' }
    
    复制代码

    来分析一波吧!开始var了一个对象a,b是对a的引用。也就是说a和b此时指向同一块内存,当改变b.name时,还是指向的那块内存,改变了那块内存里的内容,所以a也发生了改变。当b被覆盖时(var b= {name:'lisi'}),b也就指向了一块新的内存,所以最后结果不同。

  • 当一个node.js文件执行时 ,会创建一个module对象,同时module对象会创建一个exports属性,初始化的值是

     module.exports = {};
    复制代码
  • 如果希望模块成为一个传统的模块实例,也就是 exports.xxx=xxx 这种情况下可以直接使用exports导出

这时exports.xxx就像开始例子中的直接改变b.name的情况,随着exports 的改变module.exports也改变

  • 但是如果希望模块是一个特别的类型(我称它是覆盖式类型) ,引用时 直接就像下面这样,就必须使用module.exports了,不能只用exports。因为如果只是用exports就像开始例子中 var b= {name:'lisi'};b直接被覆盖,它此时指向就和module.exports不同了 。结果也就不同了

    const {rmbToDollar,dollarToRmb} = require('./currency/currency');
    console.log(rmbToDollar(6));
    console.log(dollarToRmb(1));
    复制代码
  • 为甚么非要两者相同 ,因为module.exports才是真正的接口,exports只不过是它的一个辅助工具。require引用时最终返回调用的是module.exports而不是exports。

分类:
前端
标签:
分类:
前端
标签: