崩溃日常

106 阅读2分钟
我的崩溃日常

下面我来介绍一下让我头疼的题目. 感觉对了的是蒙的 本来堆栈概念就学的不清楚, 现在又来了.

相信每一个前端小伙伴都期望者自己成为项目压轴的大佬 ,那我们要通过何种方式成为梦想中的自己呢 ? 没错 ,像我一样迈出第一步.封装一个自己的模块. 下面我们来一起看看我遇到的两种模块变量导出遇到的问题...

image.png

这道题的正确答案是2,当然了.我选的是exports的赋值,所以,我是菜鸡大家不要学我.从下面两对象之间的关系我们可以知道 ,module.exports和exports都指向同一个堆地址的空对象,name就是说 他们的栈地址存的是这个堆地址的地址码(0X....).那么当module.exports=2就是把堆地址的地址码覆盖成了2,这样的话 ,导出的话只能是2了

image.png

这个题跟上面同理 ,exports被值类型赋值 所以导出又以module.exports为主,所以导出结果为module.exports的空对象, image.png 这个呢,是两个对象在同一个堆地址里添加属性 ,有这个属性名是调取赋值 ,没有则是添加.所以可以理解成共同添加 image.png 最后这个也是对象的赋值 ,但是是引用类型 .给exports被赋值的话会重新开辟一个对空间,我们有说过如果直接给exports对象赋值(例如:exports={a:1,b:2}),此时,exports就不会再指向module.exports,而转而指向这个新对象,此时,exports与module.exports不是同一个对象。可是输出时还是module.exports指向为准.像极了你的工资卡主卡上交手里留着副卡的样子对吗?

导出模块有两种方式

  • exports
  • module.exports
// 定义方法,常量
const myPI = 3.14
const add = (a,b) => a + b;

// 导出,两种方法任意都可以
// 方法一:
exports.myPI = myPI
exports.add = add

// 方法二:
module.exports.myPI = myPI
module.exports.add = add

// 方法二(变形)
module.exports  = {
    myPI,
    add
}

在阅读其它人的代码时,可能会遇到这两种不同的写法。所以我们还是有必要了解一下的。好的 ,那么问题就出在这里

两个对象的关系

  • 初始exports和module.exports是指向同一块内存区域,其内容都是一个空对象。(exports是module.exports的别名)即:
 // 写法1 mymodule.js
 exports.f = function(){ }
 exports.pi = 3.1415926
 // 写法2 mymodule.js
module.exports.f = function(){ }
module.exports.pi = 3.1415926

在定义模块时: 如果直接给exports对象赋值(例如:exports={a:1,b:2}),此时,exports就不会再指向>module.exports,而转而指向这个新对象,此时,exports与module.exports不是同一个对象。

image.png

image.png

image.png

image.png

当然 通过以上我得出一个结论 就是 导出二选一就不会有问题 混着用就会出问题 所以 大家懂我意思吧!!!!