您好,登录后才能下订单哦!
这篇文章主要介绍“javascript两个函数相互调用防止死循环的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“javascript两个函数相互调用防止死循环的方法是什么”文章能帮助大家解决问题。
最近碰到了一个问题,就是两个函数相互调用遭遇死循环的问题,想了半天终于想出了一个算法破解,姑且叫它熵递减算法。
问题的抽象代码如下
/*
* methodA 和 methodB 循环调用,是死循环
* */
function methodA() {
console.log('A的事情');
methodB();
}
function methodB() {
console.log('B的事情');
methodA();
}不论调用哪个方法,都会产生死循环。
我想要的效果是:
如果触发A方法时,也执行一下B方法,到此为止不再循环下去,反之亦然。
因此,必须能判断方法是主动发起的,还是被动的。
抽象代码如下:
/*
* 解决问题的关键在于,判断方法是主动发起的,还是被动的
* */
function methodA() {
console.log('A的事情');
if('A是主动的'){
methodB();
}else{
// 不再调用下去
}
}
function methodB() {
console.log('B的事情');
if('B是主动的'){
methodA();
}else{
// 不再调用下去
}
}解法,就是熵递减算法,如下
/*
* 熵递减算法
* */
var pairMethodStep = 2;
function methodA() {
pairMethodStep --;
console.log('A的事情');
if(pairMethodStep === 1){
methodB();
}else{
pairMethodStep = 2;
}
}
function methodB() {
pairMethodStep --;
console.log('B的事情');
if(pairMethodStep === 1){
methodA();
}else{
pairMethodStep = 2;
}
}熵递减算法的说明:
给一个全局变量,叫做总步数pairMethodStep ,初始值为2。任一个方法执行时,做完自己的事情后,把pairMethodStep减成1。然后,判断此时的pairMethodStep,如果是1, 就调用另一个方法;如果是0了,就不再继续调用了,而是把pairMethodStep恢复成2。
我们分析一下代码执行的过程。主动的方法执行前,pairMethodStep的值是2,它做完自己的事后,把pairMethodStep的值变成了1,紧跟着就会执行被动的方法;被动的方法执行前,pairMethodStep的值是1,被动的方法做完自己的事情后,把pairMethodStep的值减成了0,不会再调用另一个方法了(不会发生死循环了),而仅仅是把pairMethodStep还原成2。
目的达到。熵递减算法,能完美地解决两个函数相互调用的问题。
两个函数互相调用时
(当一个系统比较大时,尤其是涉及到一些复杂的算法时,很有可能会碰到死循环的情况发生,造成系统的CPU飙升)
function a1() {
console.log("a1");
b1();
}
function b1() {
console.log("b1");
a1();
}会进入死循环
就类似for循环,或者递归函数如果没有退出条件就会一直执行
let flagNum = 1;
function a1() {
flagNum--;
console.log("a1");
if (flagNum === 0) {
b1();
} else {
flagNum = 1;
}
}
function b1() {
flagNum--;
console.log("b1");
if (flagNum === 0) {
a1();
} else {
flagNum = 1;
}
}关于“javascript两个函数相互调用防止死循环的方法是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。