打个比方最初设置 var data = http://developer.51cto.com/art/201704/obj.data 的时刻,内存中的情况大年夜概是:
- | Addr | 内容 |
- |----------|--------
- | obj.data | 内存1 |
- | data | 内存1 |
所以经由过程 data.xx 可以修改 obj.data 的内存1。
然后设置 data = http://developer.51cto.com/art/201704/xxx,因为 data 是拷贝的一个新的值,只是这个值是一个引用(指向内存1)罢了。让它等于别的一个对象就比如:
- | Addr | 内容 |
- |----------|--------
- | obj.data | 内存1 |
- | data | 内存2 |
让 data 指向了新的一块内存2。
如不雅是传统的引用(如上文中提到的 C++ 的引用),那么 obj.data 本身会变成新的内存2,但 JavaScript 中均是值传递,对象在传递的过程中拷贝了一份新的引用。所以这个新拷贝的变量被改变并不影响本来的对象。
Node.js 中的 module.exports 与 exports
上述例子中的 obj.data 与 data 的关系,就是 Node.js 中的 module.exports 与 exports 之间的关系。让我们来看看 Node.js 中 require 一个文件时的实际构造:
- var a = {n: 1};
- var b = a;
- a.x = a = {n: 2};
- console.log(a.x);
- console.log(b.x);
- function require(...) {
- var module = { exports: {} };
- ((module, exports) => { // Node.js 中文件外部其实被包了一层自履行的函数
- // 这中心是你模块内部的代码.
- function some_func() {};
- exports = some_func;
- // 如许赋值,exports便不再指向module.exports
- // 而module.exports依旧是{}
- module.exports = some_func;
- // 如许设置才能修改到本来的exports
- })(module, module.exports);
- return module.exports;
- }
更复杂的例子
所以很天然的:
Node.js 中的 exports 就是拷贝的一份 module.exports 的引用。经由过程 exports 可以修改Node.js 当前文件导出的属性,然则不克不及修改当前模块本身。经由过程 module.exports 才可以修改到其本身。表示上来说:
- exports = 1; // 无效
- module.exports = 1; // 有效
这是二者表示上的差别,其他方面用起来都没有差别。所以你如今应当知道写module.exports.xx = xxx; 的人其实是多写了一个module.。
为了再演习一下,我们在来看一个比较复杂的例子:
按照开端的结论我们可以一步步的来看这个问题:
- var a = {n: 1}; // 引用a指向内存1{n:1}
- var b = a; // 引用b => a => { n:1 }
最开端把眼光瞄向了 require 这个模块。设法主意很简单,因为 Node.js 中惹人一个模块都是经由过程 require 这个办法加载的。于是就开端思虑 require 能不克不及在更新代码之后再次 require 一下。测验测验如下:
内部构造:
- | Addr | 内容 |
推荐阅读
移动互联网人口红利逐渐消退 华为Hi-Star晨星计划一触即发
【51CTO.com原创稿件】 据懂得,在2016岁尾,我国移动智能终端范围冲破13.7亿台,跟着人口红利减退,充分盘活、经营现有流量便成为了各行各业全新的机会与挑衅。经由过程近几年互联网手机>>>详细阅读
地址:http://www.17bianji.com/lsqh/34702.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示