溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

javascript兩個函數(shù)相互調(diào)用防止死循環(huán)的方法是什么

發(fā)布時間:2023-03-28 17:17:08 來源:億速云 閱讀:246 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“javascript兩個函數(shù)相互調(diào)用防止死循環(huán)的方法是什么”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“javascript兩個函數(shù)相互調(diào)用防止死循環(huán)的方法是什么”文章能幫助大家解決問題。

兩個函數(shù)相互調(diào)用防止死循環(huán)

最近碰到了一個問題,就是兩個函數(shù)相互調(diào)用遭遇死循環(huán)的問題,想了半天終于想出了一個算法破解,姑且叫它熵遞減算法。

問題的抽象代碼如下

/*
*  methodA 和 methodB 循環(huán)調(diào)用,是死循環(huán)
* */
function methodA() {
    console.log('A的事情');
    methodB();
}
function methodB() {
    console.log('B的事情');
    methodA();
}

不論調(diào)用哪個方法,都會產(chǎn)生死循環(huán)。

我想要的效果是:

如果觸發(fā)A方法時,也執(zhí)行一下B方法,到此為止不再循環(huán)下去,反之亦然。

因此,必須能判斷方法是主動發(fā)起的,還是被動的。

抽象代碼如下:

/*
*  解決問題的關(guān)鍵在于,判斷方法是主動發(fā)起的,還是被動的
* */
function methodA() {
    console.log('A的事情');
    if('A是主動的'){
        methodB();
    }else{
        // 不再調(diào)用下去
    }
}
function methodB() {
    console.log('B的事情');
    if('B是主動的'){
        methodA();
    }else{
        // 不再調(diào)用下去
    }
}

解法,就是熵遞減算法,如下

/*
* 熵遞減算法
* */

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;
    }
}

熵遞減算法的說明:

給一個全局變量,叫做總步數(shù)pairMethodStep ,初始值為2。任一個方法執(zhí)行時,做完自己的事情后,把pairMethodStep減成1。然后,判斷此時的pairMethodStep,如果是1, 就調(diào)用另一個方法;如果是0了,就不再繼續(xù)調(diào)用了,而是把pairMethodStep恢復(fù)成2。

我們分析一下代碼執(zhí)行的過程。主動的方法執(zhí)行前,pairMethodStep的值是2,它做完自己的事后,把pairMethodStep的值變成了1,緊跟著就會執(zhí)行被動的方法;被動的方法執(zhí)行前,pairMethodStep的值是1,被動的方法做完自己的事情后,把pairMethodStep的值減成了0,不會再調(diào)用另一個方法了(不會發(fā)生死循環(huán)了),而僅僅是把pairMethodStep還原成2。

目的達到。熵遞減算法,能完美地解決兩個函數(shù)相互調(diào)用的問題。

js函數(shù)互相調(diào)用碰到的問題

項目場景

兩個函數(shù)互相調(diào)用時

(當一個系統(tǒng)比較大時,尤其是涉及到一些復(fù)雜的算法時,很有可能會碰到死循環(huán)的情況發(fā)生,造成系統(tǒng)的CPU飆升)

        function a1() {
            console.log("a1");
            b1();
        }
        function b1() {
            console.log("b1");
            a1();
        }

問題描述

會進入死循環(huán)

原因分析

就類似for循環(huán),或者遞歸函數(shù)如果沒有退出條件就會一直執(zhí)行

解決方案

        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;
            }
        }

關(guān)于“javascript兩個函數(shù)相互調(diào)用防止死循環(huán)的方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI