• 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就行了。

    开发工具
  • 相关阅读:
    Android如何实现超级棒的沉浸式体验
    这次聊聊Promise对象
    svn add文件名包含@符号的解决方案
    证明3|n(n+1)(2n+1)
    Xcode迁移工程常见问题
    Multiple build commands for output file
    python中descriptor的应用
    xcode快捷键
    Cycript
    令assignment操作符返回一个reference to *this
  • 原文地址:https://www.cnblogs.com/cisbest/p/13516590.html
Copyright © 2020-2023  润新知