node.js 中模块的循环调用问题详解

首先,我们看一下图示代码,每一个注释其实代表一个 js 文件。所以下面其实是三个 js 文件 。第一个是我们要运行的 main 文件,后面两个是 a, b 文件。

从上面可以看书 a ,b 两个模块相互引用,上面输出结果如下所示:

那这要怎么理解呢?

首先看 main 模块,先输出  main starting; 接着调用了 a 模块;

然后我们进入到 a 模块,先输出 a starting; 接着调用 b 模块;

然后我们进入到 b 模块,先输出 b starting; 接着调用 a 模块;

但是问题来了,a 模块还没初始化好啊,所以 a 模块就会返回一个 unfinished copy, 你可以理解为返回一个空对象{};

但是,a 模块在引用 b 模块的时候,前面有个 exports.done = flase;

这就不一样了,此时就不是空对象了,而是{done: flase}; 但是如果是空对象,就会输出 undefined;

所以会输出 in b, a.done = flase ;然后 接着运行 b 模块,直到最后输出 b.done ;

接着 a 模块又开始往下运行, 输出 in a, b.done = true; 因为最后 b 模块输出的就是done=true 啊;

然后后面输出 a.done ; a 模块运行结束。

到此,a , b 两个模块都加载完毕,main 中虽然有再次引用 b 模块,但是也不会去执行了。

然后最后就是我们所见到的那个输出结果  in main, a.done=true, b.done=true。

变体

我们对 a, b 模块的语句变一变,具体如下:

 

我们删除了其中两条划黑线的句子,现在输出结果会变成什么呢?

请看下图:

这里就不细细分析了,留给大家自己分析。

时间: 2024-10-05 04:45:03

node.js 中模块的循环调用问题详解的相关文章

Angular.js中处理页面闪烁的方法详解

Angular.js中处理页面闪烁的方法详解 前言 大家在使用{{}}绑定数据的时候,页面加载会出现满屏尽是{{xxx}}的情况.数据还没响应,但页面已经渲染了.这是因为浏览器和angularjs渲染页面都需要消耗一定的时间,这个间隔可能很小,甚至让人感觉不到,这种情况一切正常,但这个时间也可能很长,这时候用户可能会看到满屏尽是{{xxxx}}.这种情况被叫做"Flash Of Unrendered Content (FOUC)(K)?and is always unwanted.".

js中的原型与原型链详解

js中的原型与原型链详解 记住下面三句话就可以理解原型: 所有的函数数据类型都天生自带一个属性Prototype(原型)这个属性的值是一个对象,浏览器会默认给他开辟一个堆内存 在浏览器给prototype开辟的堆内存当中有一个天生自带的属性是constructor,这个属性存储的值是当前函数本身 每一个对象都有一个__proto__的属性,这个属性指向当前实例所属类的prototype(如果不能确定他是谁的实例,都是Object的实例) 原型链:如果引用构造函数的实例想要查找某个属性p的话: 首

node.js中模块,require

在php,C++中都有命名空间的概念,命名空间主要是用来解决引入文件存在函数,类,变量重名的问题,在node.js中,没有命名空间这么复杂的概念,在node中,有模块的概念,也就是将功能性的代码都放在一起.然后引入,在本文件中使用.这种不会出现函数名,变量重名问题,在引入的模块中,都是以导入的方式注册的.看下面的例子: //circle.js var pi = 3.14; //计算圆的周长 exports.circle = function(r) { return 2 * pi * r; } /

Js中this用法及注意点详解

      我们在写js时,特别是用到回调函数时,经常会发现this指代的对象总是可能脱离自己的思路而发生改变.面向对象语言的特性告诉我们this始终指代它的调用者,而在js中回调函数中内部的this默认指向全局环境即最终上下文,所以很多时候我们不作this对象的声明绑定,就会发生指向错误,找不到我们想要的值.看下面这段代码: var a1={ name:"ZhuXingyu" } function outFunc(){ //函数a console.log(this.a1.name);

【js插件进阶】JS中的call()和apply()方法详解

JS中的call()和apply()方法 1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象. 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj. apply方法: 语法:apply(

JS中栈溢出,循环调用

本人在项目的开发的过程中,在配置前端页面的过程中,页面会抛出图片中的异常,浏览网上的各路大牛的博客后,大致清楚出现以上的错误是由于JS的栈溢出. 后来我发现自己写的前端的方法互相嵌套调用,就会报上述的错误,请查看下页面的方法是否有重复调用的成分. 原文地址:https://www.cnblogs.com/lululuckyboy/p/12121965.html

node.js中模块报错【window is not defined】的解决方法

(function(window) { /* Keep source code the same */ // })(typeof window == "undefined" ? global : window); // or })(this);

293 Node.js中模块的加载机制

原文地址:https://www.cnblogs.com/jianjie/p/12330578.html

js中toggle()及toggleClass()的使用详解

在javascript中toggle()为连续点击事件,当里面含有多个function(){}函数时,每次点击依次执行里面的function的函数,直至最后一个.随后每次点击都重复对这几个函数的轮番调用,toggle的语法如下 toggle(fn1,fn2,fn3·····fnN); 但当toggle(),不带参数时,与show()和hide()的作用一样,切换元素的可见状态,如果元素是可见的,则切换为隐藏状态;如果元素是隐藏的则切换为可见状态,此时括号内可添加()毫秒(如1000)等),slo