资讯专栏INFORMATION COLUMN

Node.js中module.exports和exports的区别

codecook / 1918人阅读

摘要:看了好多篇博客,对于和区别的解释众说纷纭有点迷糊,还是自己写来感受一下吧。会造成被另外一个内存地址替换,也就中断得了和的联系。调用了我调用了我调用了我两者的值又相同。小弟才疏学浅,讲解较为啰嗦,亦是初次写之,若有疏漏,妄不吝赐教,特此感谢。

看了好多篇博客,对于module.exports和exports区别的解释众说纷纭有点迷糊,还是自己写demo来感受一下吧。

module.exports和exports的默认值

console.log(module);     //Module {  id: ".", exports: {}, ...}
console.log(exports);    //{}

可以看到module.exports和exports的默认值都是空对象(对象是引用类型!)

foo.js

exports.foo = "exports调用了我";
console.log(module.exports); //{ foo: "exports调用了我" }
console.log(exports);        //{ foo: "exports调用了我" }

module.exports.foo = "module调用了我";
console.log(module.exports);  //{ foo: "module调用了我" }
console.log(exports);         //{ foo: "module调用了我" }

main.js

var foo= require("./foo");
console.log(foo);    //{ foo: "module调用了我" }

结论:require调用的是module.exports当中的值,而exports则是module.exports的引用,两者调用的是同一个内存地址。

foo.js

exports = "exports调用了我";
console.log(module.exports); //{}
console.log(exports);        //{ foo: "exports调用了我" }

main.js

var foo= require("./foo");
console.log(foo);    //{}

如果你对引用类型的理解不够深刻,直接给exports赋值。会造成exports被另外一个内存地址替换,也就中断得了module.exports和exports的联系。

但你又想让他们赋值相同,你可以这么做。
foo.js

exports = "exports调用了我";
module.exports = exports;
console.log(module.exports); //{foo: "exports调用了我"}
console.log(exports);        //{ foo: "exports调用了我" }

两者的值又相同。因为栗子里用的是字符串,是普通类型,意味着每次改变值都得用module.exports = exports;去重新同步值。所以还是不建议exports = "exports调用了我";这样去赋值,保留初始值的对象形式或者自己赋值成引用类型对使用会比较方便。

小弟才疏学浅,讲解较为啰嗦,亦是初次写之,若有疏漏,妄不吝赐教,特此感谢。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95597.html

相关文章

  • Node.js module.exports exports 区别

    摘要:中最常用的恐怕就是,以及了,那么和这两者有什么区别,在什么情况下使用,又在什么时候使用。在拼接之后的代码中,给这个函数传入的是,也就是说和引用的是同一个对象。如果我们给增加属性,那么因为也会增加相同的属性,此时。 Node.js中最常用的恐怕就是 require, exports 以及 module.exports 了,那么 exports 和 module.exports 这两者有什...

    laoLiueizo 评论0 收藏0
  • 谈谈Js前端模块化规范

    摘要:依赖全部加载完成后,调用回调函数规范异步加载模块规范和很相似,简单,并与和的规范保持了很大的兼容性在规范中,一个模块就是一个文件。 抛出问题: 在开发中在导入模块时经常使用require和import; 导出模块时使用module.exports/exports或者export/export default; 有时候为了引用一个模块会使用require奇怪的是也可以使用import?...

    Steve_Wang_ 评论0 收藏0
  • 谈谈Js前端模块化规范

    摘要:依赖全部加载完成后,调用回调函数规范异步加载模块规范和很相似,简单,并与和的规范保持了很大的兼容性在规范中,一个模块就是一个文件。 抛出问题: 在开发中在导入模块时经常使用require和import; 导出模块时使用module.exports/exports或者export/export default; 有时候为了引用一个模块会使用require奇怪的是也可以使用import?...

    NeverSayNever 评论0 收藏0
  • 兼容多种模块规范(AMD,CMD,Node)代码

    摘要:主要区别是需要在声明模块时指定所有的依赖,通过形参传递依赖到模块内容中。 前言 昨天,公司同事问了我如下一个问题: showImg(https://segmentfault.com/img/bVWXYP?w=548&h=346); 说他在看一个插件时,看到了源码结构如截图所示,他知道(function(){})()是一种立即执行函数,但是在截图中,最后的那个圆括号里又写了一个函数fun...

    Shonim 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<