javascript两个函数相互调用防止死循环的方法是什么

其他教程   发布日期:2024年05月14日   浏览次数:312

这篇文章主要介绍“javascript两个函数相互调用防止死循环的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“javascript两个函数相互调用防止死循环的方法是什么”文章能帮助大家解决问题。

两个函数相互调用防止死循环

最近碰到了一个问题,就是两个函数相互调用遭遇死循环的问题,想了半天终于想出了一个算法破解,姑且叫它熵递减算法。

问题的抽象代码如下

  1. /*
  2. * methodA 和 methodB 循环调用,是死循环
  3. * */
  4. function methodA() {
  5. console.log('A的事情');
  6. methodB();
  7. }
  8. function methodB() {
  9. console.log('B的事情');
  10. methodA();
  11. }

不论调用哪个方法,都会产生死循环。

我想要的效果是:

如果触发A方法时,也执行一下B方法,到此为止不再循环下去,反之亦然。

因此,必须能判断方法是主动发起的,还是被动的。

抽象代码如下:

  1. /*
  2. * 解决问题的关键在于,判断方法是主动发起的,还是被动的
  3. * */
  4. function methodA() {
  5. console.log('A的事情');
  6. if('A是主动的'){
  7. methodB();
  8. }else{
  9. // 不再调用下去
  10. }
  11. }
  12. function methodB() {
  13. console.log('B的事情');
  14. if('B是主动的'){
  15. methodA();
  16. }else{
  17. // 不再调用下去
  18. }
  19. }

解法,就是熵递减算法,如下

  1. /*
  2. * 熵递减算法
  3. * */
  4. var pairMethodStep = 2;
  5. function methodA() {
  6. pairMethodStep --;
  7. console.log('A的事情');
  8. if(pairMethodStep === 1){
  9. methodB();
  10. }else{
  11. pairMethodStep = 2;
  12. }
  13. }
  14. function methodB() {
  15. pairMethodStep --;
  16. console.log('B的事情');
  17. if(pairMethodStep === 1){
  18. methodA();
  19. }else{
  20. pairMethodStep = 2;
  21. }
  22. }

熵递减算法的说明:

给一个全局变量,叫做总步数pairMethodStep ,初始值为2。任一个方法执行时,做完自己的事情后,把pairMethodStep减成1。然后,判断此时的pairMethodStep,如果是1, 就调用另一个方法;如果是0了,就不再继续调用了,而是把pairMethodStep恢复成2。

我们分析一下代码执行的过程。主动的方法执行前,pairMethodStep的值是2,它做完自己的事后,把pairMethodStep的值变成了1,紧跟着就会执行被动的方法;被动的方法执行前,pairMethodStep的值是1,被动的方法做完自己的事情后,把pairMethodStep的值减成了0,不会再调用另一个方法了(不会发生死循环了),而仅仅是把pairMethodStep还原成2。

目的达到。熵递减算法,能完美地解决两个函数相互调用的问题。

js函数互相调用碰到的问题

项目场景

两个函数互相调用时

(当一个系统比较大时,尤其是涉及到一些复杂的算法时,很有可能会碰到死循环的情况发生,造成系统的CPU飙升)

  1. function a1() {
  2. console.log("a1");
  3. b1();
  4. }
  5. function b1() {
  6. console.log("b1");
  7. a1();
  8. }

问题描述

会进入死循环

原因分析

就类似for循环,或者递归函数如果没有退出条件就会一直执行

解决方案

  1. let flagNum = 1;
  2. function a1() {
  3. flagNum--;
  4. console.log("a1");
  5. if (flagNum === 0) {
  6. b1();
  7. } else {
  8. flagNum = 1;
  9. }
  10. }
  11. function b1() {
  12. flagNum--;
  13. console.log("b1");
  14. if (flagNum === 0) {
  15. a1();
  16. } else {
  17. flagNum = 1;
  18. }
  19. }

以上就是javascript两个函数相互调用防止死循环的方法是什么的详细内容,更多关于javascript两个函数相互调用防止死循环的方法是什么的资料请关注九品源码其它相关文章!