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


Posted in Javascript onApril 19, 2017

今天看了下node.js的require方法的源码,终于搞清楚exports和module.exports的区别了。

我们知道,node.js的模块暴露有两种方法。

1. 方式一:用exports

//a.js

 exports.log =function (str) {
  console.log(str);
}
//b.js

 var s = require("./a");
 s.log("哈哈哈哈");

2. 方式二:用module.exports

//a.js
 module.exports = function (str) {
    console.log(str);
 }

//b.js
 var s = require("./a");
 s("嘻嘻嘻嘻");

如果将第一种方式的exports按照第二种方式写成下面这样就会出错:

//a.js
 exports = function (str) {
  console.log(str);
}
//b.js

 var s = require("./a");
 s("哈哈哈哈");

exportsmodule.exports的初始值指向的是空对象,即{}。从源码可以看到,其实模块的require方法实质上是调用了_load方法,而_load方法,最终返回的是module.exports

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

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

来分析一下出错的原因。

由于最开始的时候,exportsmodule.exports都指向同一个对象。

第一种方式,是在给这个空对象{}添加属性,又因为module.exports也是指向这个对象的,所以最终require方法返回的module.exports是指向了这个具有log方法的对象的,可以引用到模块。

第二种方式是让module.exports指向一片新的内存空间,exports指向的仍然是{},但是由于require方法返回的是module.exports,所以最终也能引入模块。

但是最后那种写法是让exports指向一片新的内存空间,module.exports指向的仍然还是{},那么最终require方法是将module.exports返回,所以会导致报错,说s不是一个function。

所以:

请牢记:require方法返回的是module.exports

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 日历提醒系统( 兼容所有浏览器 )
Apr 07 Javascript
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
Apr 27 Javascript
深入理解JavaScript作用域和作用域链
Oct 21 Javascript
Javascript中的isNaN函数使用说明
Nov 10 Javascript
js的for in循环和java里foreach循环的区别分析
Jan 28 Javascript
JavaScript检测实例属性, 原型属性
Feb 04 Javascript
IE下使用jQuery重置iframe地址时内存泄露问题解决办法
Feb 05 Javascript
深入理解JavaScript内置函数
Jun 03 Javascript
Json解析的方法小结
Jun 22 Javascript
利用Javascript实现BMI计算器
Aug 16 Javascript
node.js实现回调的方法示例
Mar 01 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
Oct 19 Javascript
jQuery ajax请求struts action实现异步刷新
Apr 19 #jQuery
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
Apr 19 #Javascript
微信小程序 登录的简单实现
Apr 19 #Javascript
微信小程序开发入门基础教程
Apr 19 #Javascript
微信小程序教程系列之视图层的条件渲染(10)
Apr 19 #Javascript
JS实现AES加密并与PHP互通的方法分析
Apr 19 #Javascript
vue2.0父子组件间通信的实现方法
Apr 19 #Javascript
You might like
PHP在字符断点处截断文字的实现代码
2011/04/21 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
CI框架集成Smarty的方法分析
2016/05/17 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
2016/05/22 PHP
PHP实现腾讯与百度坐标转换
2017/08/05 PHP
php使用自带dom扩展进行元素匹配的原理解析
2020/05/29 PHP
用js实现手把手教你月入万刀(转贴)
2007/11/07 Javascript
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
JQuery下拉框应用示例介绍
2014/04/23 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
2017/07/18 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
[03:08]TI9战队档案 - Vici Gaming
2019/08/20 DOTA
利用Python中的输入和输出功能进行读取和写入的教程
2015/04/14 Python
使用PyInstaller将python转成可执行文件exe笔记
2018/05/26 Python
pandas ix &iloc &loc的区别
2019/01/10 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
pycharm实现在子类中添加一个父类没有的属性
2020/03/12 Python
Python sorted排序方法如何实现
2020/03/31 Python
Keras中的多分类损失函数用法categorical_crossentropy
2020/06/11 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
2020/06/22 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
StubHub德国:购买和出售门票
2017/09/06 全球购物
以实惠的价格轻松租车,免费取消:Easyrentcars
2019/07/16 全球购物
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
为什么会有内存对齐
2016/10/10 面试题
厨房工作人员岗位职责
2013/11/15 职场文书
求职简历中个人的自我评价
2013/12/25 职场文书
我的网上商城创业计划书
2013/12/26 职场文书
沙滩主题婚礼活动策划方案
2014/09/15 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书