zoukankan      html  css  js  c++  java
  • commonJS规范中module.exports与exports的区别

    用代码测试下,同时用module.exportsexports导出属性,默认会使用谁导出的。

     \ app.json
        module.exports = {
          name: "module.exports",
        };
        exports.name = "exports";
    
       \ main.js
    let app = require("./app.js");
    console.log(app.name);  //输出 “module.exports”
    

    看来,同时用module.exportsexports导出属性。会默认使用module.exports导出的属性。

    最开始 module.exportsexports 输出的都是一个空对象。

    console.log(module.exports);            // 输出 {}
        
    console.log(exports);                   // 输出 {}
    
    console.log(module.exports === exports);    // 输出 true
    

    通过给 exports 赋值属性

        console.log(module.exports);
        
        console.log(exports);
        
        console.log(module.exports === exports);
        
        exports.name = "exports";  // 赋值属性
        
        console.log(module.exports === exports);  // 输出true
    
        console.log(module.exports.name);         // 输出"exports"
    

    到这一步,module.exportsexports 指代的还是同一对象。

    在给 exports 属性赋值为一个对象

        console.log(module.exports);
        
        console.log(exports);
        
        console.log(module.exports === exports);  // 输出 true
        
        exports = {
          name: "exports",
        };
        
        console.log(module.exports === exports); // 输出 false
        
        console.log(module.exports.name); // 输出 undefined   
    

    到这里,module.exportsexports 指代的就不是同一引用了,已经是不同的对象了。

    原因: exports对象是通过形参的方式传入的,直接赋值形参会改变形参的引用,但并不能改变作用域外的值。module.exports就是为了解决exports直接赋值的问题而产生的。为了减少BUG,尽量不使用exports就行了。

    开发工具
  • 相关阅读:
    可能是把 ZooKeeper 概念讲的最清楚的一篇文章
    Tomcat基本知识(一)
    PowerDesigner显示mysql数据表注释
    java中wait和notify的虚假唤醒问题
    为什么wait和notify只能在synchronized中?
    一篇blog带你了解java中的锁
    jvm类加载机制总结
    Java的浅拷贝与深拷贝总结
    政府网站公祭日,如何使网站整体变灰
    java 为什么重写equals一定要重写hashcode?
  • 原文地址:https://www.cnblogs.com/cisbest/p/13516590.html
Copyright © 2011-2022 走看看