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

    经常能看到两种导出模块的方式:module.exports和exports。
    穿插一个必备小知识:在文件a.js中用exports或module.exports导出的对象(方法、变量),可以在另一个文件b.js中通过require('./a')引用。

    module和exports是Node.js给每个js文件内置的两个对象。

    在node.js中打印console.log(module)可以看出 moduleexports 都是node中提供的两个对象,其中module里包裹着exports

    Module {
      id: '.',
      exports: {},
      parent: null,
      filename: '',
      loaded: false,
      children: [],
      paths:[] 
      }
    

    实际上这两个对象指向同一块内存。这也就是说module.exports和exports是等价的。如图示:

     
     

    例如:
        exports.age = 18;
        module.exports.age = 18;
    

    这两种写法是一致的(都相当于给最初的空对象{}添加了一个属性,通过require得到的就是{age: 18})。

    但是这里有个重点,每个导出模块 node.js 默认会返回 return module.exports;

    当直接给module.exports或exports赋值时,就相当于改变了内存,两者指代的就不是同一内存,这样就会导致exports中的内容失效,因为module.exports所指向的内存永远是真正的内存

     
     
    • 直接给module.exports赋值导致内存改变,新生成的内存依然是真正的内存,那exports原先指向的内存就无效了

    例如:

    //song.js
    module.exports = {name: '樱花树下'};
    exports = {name: '不吐不快'};
    
    //main.js
    let song= require('./song');
    console.log(song);//输出:{name: '樱花树下'}
    
    • 直接给exports赋值导致内存改变,那么exports所指的内存就是无效内存,所以会返回module.exports空对象

    例如:

    //song.js
    exports = {name: '不吐不快'};
    
    //main.js
    let song= require('./song');
    console.log(song);//输出:{}
    

    有一种赋值特殊就是,exports = module.exports 这个用来重新建立引用关系的

    就是重新把无效内存指向真正内存 这样 exports 和 module.exports 就重新建立了联系



  • 相关阅读:
    ibatis命名空间namespace的使用
    MyEclipse 下新建Flex与JAVA交互项目
    第2章 TCP/IP 和Internet
    第一部分:TCP/IP 基础 第一章 开放式通信模型简介
    01-布局扩展-利用盒模型完成圣杯布局(双飞翼布局)
    01-布局扩展-用calc来计算实现双飞翼布局
    01-布局扩展-BFC完成圣杯布局
    Nginx
    uni-app mpvue wepy websocket的介绍
    taro 使用taro中的vue来完成小程序的开发
  • 原文地址:https://www.cnblogs.com/jianxian/p/12151010.html
Copyright © 2011-2022 走看看