Comment.js模块暴露方法(exports、module.exports)的区别
来源:互联网 发布:马云 英文演讲 知乎 编辑:程序博客网 时间:2024/06/08 06:49
exports和module.exports的区别
由来
- Node.js 引入了模块(Module)概念,一个模块可以通过module.exports 或 exports将函数、变量等导出,以使其它 JavaScript 脚本通过require() 函数引入并使用。
区别
- 每一个Node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {}
module.exports = {};
- exports 是指向的 module.exports 的引用,在模块内部大概是这样:
exports = module.exports = {};//举个栗子,在node.js中创建模块非常简单,一个文件就是一个模块,所以我们创建一个name.js文件就创建了一个模块name.js,使用exports和require对象对外提供接口和引用模块。
- exports和module.exports指向同一块内存,但require()返回的是module.exports而不是exports。
var str = "difference"exports.a = str;exports.b = function () {}
- 给 exports 赋值其实是给 module.exports 这个空对象添加了两个属性而已,上面的代码相当于:
var str = "difference"module.exports.a = str;module.exports.b = function () {}
exports和module.exports的使用举例
- 使用exports
app.jsvar s = require("./log");s.log("hello");
log.jsexports.log =function (str) { console.log(str);}
- 使用module.exports
app.jsvar s = require("./log");s.log("hello");
log.jsmodule.exports =function (str) { console.log(str);}
- 上述两种用法都没问题,但如果这样使用,运行程序就会报错。
exports = function (str) { console.log(str);}
- 前面的例子中给 exports 添加属性,只是对 exports 指向的内存做了修改。而上例则是对exports指向的内存进行了覆盖,使exports指向了一块新的内存,这样,exports和module.exports指向的内存并不是同一块,exports和module.exports并无任何关系。exports指向的内存有了变化,而module.exports指向的内存并无变化,仍为空对象{}。require得到的会是一个空对象,则会有
TypeError: s.log is not a function报错信息。
- 再看下面的例子
app.js var x = require('./init'); console.log(x.a)
init.js module.exports = {a: 2} exports.a = 1
运行app.js会有输出:2
- 这也就是module.exports对象不为空的时候exports对象就自动忽略,因为module.exports通过赋值方式已经和exports对象指向的变量不同了,exports对象怎么改和module.exports对象没关系了。
exports = module.exports = somethings等价于 module.exports = somethings exports = module.exports
- 原因也很简单, module.exports = somethings 是对 module.exports 进行了覆盖,此时 module.exports 和 exports 的关系断裂,module.exports 指向了新的内存块,而 exports 还是指向原来的内存块,为了让 module.exports 和 exports 还是指向同一块内存或者说指向同一个 “对象”,所以我们就 exports = module.exports 。
总结
exports是引用 module.exports的值。exports 被改变的时候,module.exports不会被改变,而模块导出的时候,真正导出的执行是module.exports,而不是exports。
最后,关于exports和module.exports的关系可以总结为
- module.exports 初始值为一个空对象 {},所以 exports 初始值也是 {};
- exports 是指向的 module.exports 的引用;
- require() 返回的是 module.exports 而不是 exports;
阅读全文
0 0
- Comment.js模块暴露方法(exports、module.exports)的区别
- Node.js模块导出exports 和 module.exports 的区别
- Node.js模块导出exports 和 module.exports 的区别
- Node.js模块导出exports 和 module.exports 的区别
- Node.js模块导出exports 和 module.exports 的区别
- Node.js的模块导出exports 和 module.exports 的区别
- Node.js中require、exports、module模块的区别
- Node.js中exports与module.exports的区别
- Node.js中module.exports与exports的区别
- Node.js: exports与module.exports的区别
- node.js中module.exports与exports的区别
- 【Node.js】module.exports和exports的区别与使用
- Node.js中的module.exports和exports的区别
- node.js中module.exports和exports的区别
- Node.js的module.exports与exports
- module.exports与exports的区别
- exports 和 module.exports 的区别
- [前端] exports 和 module.exports 的区别
- Android中ContentProvider的理解使用
- 在FPGA上实现H.264/AVC视频编码标准
- Android Studio 小技巧/快捷键 合集
- MongoDB 条件操作符说明
- springboot war包导出
- Comment.js模块暴露方法(exports、module.exports)的区别
- 第一天打卡,linux学习
- Android Studio使用gradle打包jar文件脚本:
- String.split
- 获取的网络图片圆角后 放入 Button 中
- Sublime Text3 自定义快速生成代码
- 同等学力是什么意思?
- Verilog中parameter、reg和wire区别
- eclipse使用tomcat遇到的问题