module.exports和exports的区别

module.exports和exports的区别

我们要弄明白module.exports和exports的区别,就要清楚什么是值类型,什么是引用类型。值类型是存储在栈上,引用类型存储在堆上。引用类型的名字是存储在栈上的,这个名字指向堆上的一个地址即该引用类型所在的地址。

我们用代码认识一下引用类型

var p1 = {
    name: 'zhangsan',
    age: 18
}
var p2 = p1
console.log(p2.name) //打印出zhangsan

此时 var p1 和var p2指向同一个堆地址即两个存储在栈上的引用类型名称 指向同一个引用类型,此时当我门改变p2的属性值,p1也会跟着改变

var p1 = {
    name: 'zhangsan',
    age: 18
}
var p2 = p1
p2.age = 19
console.log(p1.age) //打印结果 19

其实此时存储在栈上的变量名称p1和p2是指向同一个堆中的对象,当我们改变对象的某个属相。相当于两个变量名称指向的同一个对象改变了。

理解了上面的引用类型改变的原理之后其实就很好理解了。moduleexportsNode.js给每个js文件内置的两个对象。可以通过console.log(module.exports)console.log(exports)打印出来都为一个空对象{}

实际上两者的关系就如同上面的p1和p2的关系。module.exports和exports是指向同一个堆地址的

module.exports = exports = {}

require引入的对象本质上是module.exports。这就产生了一个问题,当 module.exportsexports指向的不是同一块内存时,exports的内容就会失效。

示例代码common.js :

module.exports={
    sayHello:name=>{
        console.log(`hello ${name}`)
    }
}
exports.sayGoodbye=name=>{
    console.log(`Goodbye ${name}`)
}

示例代码index.js :

const common =require('./common.js')

common.sayHello('xin')
common.sayGoodbye('xin') //这里会报错 common.sayGoodbye is not function

这里的报错是因为当执行common.js文件中的module.exports={ ...}这段代码的时候 实际上是给module.exports重新赋值

又因为require默认引用的是module.exports所指向的对象。所以此时exports的导出依然已经失效。就抛出了common.sayGoodbye is not function的错误

总结:

初始状态为module.exports = exports ={} 当exports 和module.exports指向的不是同一个堆地址时。exports失效!

posted @ 2022-03-16 13:39  hello_xier  阅读(537)  评论(0编辑  收藏  举报