exports 和 module.exports 的区别

来源:互联网 发布:淘宝免费申请试用报名 编辑:程序博客网 时间:2024/05/20 09:45

require 用来加载代码,而 exports 和 module.exports 则用来导出代码。但很多新手可能会迷惑于 exports 和 module.exports 的区别,为了更好的理解 exports 和 module.exports 的关系,我们先来巩固下 js 的基础。示例:

test.js

var a = {name: 1};var b = a;

console.log(a);console.log(b);

b.name = 2;console.log(a);console.log(b);

var b = {name: 3};console.log(a);console.log(b);

运行 test.js 结果为:

{ name: 1 }{ name: 1 }{ name: 2 }{ name: 2 }{ name: 2 }{ name: 3 }

解释:a 是一个对象,b 是对 a 的引用,即 a 和 b 指向同一块内存,所以前两个输出一样。当对 b 作修改时,即 a 和 b 指向同一块内存地址的内容发生了改变,所以 a 也会体现出来,所以第三四个输出一样。当 b 被覆盖时,b 指向了一块新的内存,a 还是指向原来的内存,所以最后两个输出不一样。

明白了上述例子后,我们只需知道三点就知道 exports 和 module.exports 的区别了:

  1. module.exports 初始值为一个空对象 {}
  2. exports 是指向的 module.exports 的引用
  3. require() 返回的是 module.exports 而不是 exports

现在我们来看 Node.js 官方文档的截图:屏幕快照 2016-09-29 上午11.59.44.png我们经常看到这样的写法:

exports = module.exports = somethings

上面的代码等价于:

module.exports = somethingsexports = module.exports

原理很简单,即 module.exports 指向新的对象时,exports 断开了与 module.exports 的引用,那么通过 exports = module.exports 让 exports 重新指向 module.exports 即可。

93 回复
 1

最近也更新这个问题的文章http://cnodejs.org/topic/52308842101e574521c16e06GC一下。

好文,mark

刚想到这个问题就看到了,真是太巧了~

“也就是说 exports 和 module.exports 不再指向同一块内存,也就是说此时 exports 和 module.exports 毫无联系,也就是说 module.exports 指向的那块内存并没有做任何改变,仍然为一个空对象 {} ,也就是说 area.js 导出了一个空对象,所以我们在 app.js 中调用 area(4) 会报 TypeError: object is not a function 的错误。”

这段话好多 也就是说。。。。

 5

写的非常赞. 要是有图做个说明就最好了.

一开始我没有理解,原因是我没有明白nodejs 是怎么创建module.exports 和 exports,并且二者关系是怎么样的.

系统自动给nodejs 文件增加2个变量 exports 和 module, module 又有一个属性 exports, 这个exports 属性指向一个空对象 {}; 同时 exports这个变量也指向了这个空对象{};

于是就有了 exports => {} <=module.exports.

这2个exports 其实是没有直接关系的,唯一的关系是: 他们初始都指向同一个空对象{};如果其中一个不指向做个空对象了, 那么他们的关系就没有了.

 1

懂的人看楼主的解释觉得很多余,不懂的人估计看得会比较迷糊,一个简单的例子:~function(exports, module){console.log(exports)//这里只要进行其它初始化的操作都会导致同样的效果exports = {}console.log(exports)console.log(module.document)}(window.document, window)

好文!

妥妥的~

比较基础, 解释的很到位. 顶一个

向各位大神请教个问题,就是关于 区域块刷新的办法, 因为不想使用 res.redirect(’/’); 每次一个请求后(如点击分页)就跳转到首页重新查询所有数据, 觉得这个太浪费资源了

如果组件是一堆属性或方法使用exports就够了,如果组件是一个对象使用module.exports再配合prototype就灵活很多

很简单明了

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 京东商城购物车装满了怎么办 商家想入住美团没有营业执照怎么办 旅行团定好的人数临时加人该怎么办 淘宝上发货后12天未收到款怎么办 京东购买的东西烂了怎么办 苹果4s手机激活密码忘了怎么办 小米4c返回键失灵了怎么办 小米4c下面三个键失灵怎么办 谷歌浏览器打不开指定的网址怎么办 电脑上我的电脑图标没了怎么办 手机上的短信图标没了怎么办 qq密保手机被别人换了怎么办 苹果六手机很卡网络不给力怎么办 堡垒之夜卡在载入界面怎么办 登录新福建一直说网络不给力怎么办 开发游戏平台给了钱不给东西怎么办 代号英雄与服务器断开连接了怎么办 千牛聊天页面买家信息不显示怎么办 秒拍存草稿箱的视频没了怎么办? 登录山东掌厅出现服务器错误怎么办 微信号被多人投诉被限制登录怎么办 联想平板电脑开机密码忘记了怎么办 申请的qq没登录忘了账号怎么办 炫舞时代由于网络原因登不上怎么办 qq申请太多进不了热聊怎么办 手机号申请的微信号被盗了怎么办 买菜别人少找了钱不还怎么办 在掌上英雄联盟买皮肤买错区怎么办 win8我的电脑图标没了怎么办 英雄联盟老是卡在安全扫描怎么办 英雄联盟活动送皮肤没送怎么办 电脑换完系统有些页面打不开怎么办 王卡助手交手机费页面打不开怎么办 在浏览器上打不开路由器页面怎么办 英雄联盟读条的时候自动关机怎么办 手机的位置信息开不了怎么办呢 滴滴车主接到乘客返回路程要怎么办 移动换话费积分是发什么短信怎么办 手机店积分换手机被贷款怎么办 心悦俱乐部礼包已过期是怎么办 心悦兑换的东西不是账号绑定怎么办