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 就重新建立了联系



  • 相关阅读:
    LeetCode 121. Best Time to Buy and Sell Stock
    LeetCode 221. Maximal Square
    LeetCode 152. Maximum Product Subarray
    LeetCode 53. Maximum Subarray
    LeetCode 91. Decode Ways
    LeetCode 64. Minimum Path Sum
    LeetCode 264. Ugly Number II
    LeetCode 263. Ugly Number
    LeetCode 50. Pow(x, n)
    LeetCode 279. Perfect Squares
  • 原文地址:https://www.cnblogs.com/jianxian/p/12151010.html
Copyright © 2011-2022 走看看