欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2023年03月28日 16:56:13   作者:凝望那片天空  
這篇文章主要介紹了兩個(gè)函數(shù)相互調(diào)用如何防止死循環(huán)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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

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

問(wèn)題的抽象代碼如下

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

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

我想要的效果是:

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

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

抽象代碼如下:

/*
* ?解決問(wèn)題的關(guān)鍵在于,判斷方法是主動(dòng)發(fā)起的,還是被動(dòng)的
* */
function methodA() {
? ? console.log('A的事情');
? ? if('A是主動(dòng)的'){
? ? ? ? methodB();
? ? }else{
?? ??? ?// 不再調(diào)用下去
?? ?}
}
function methodB() {
? ? console.log('B的事情');
? ? if('B是主動(dòng)的'){
? ? ? ? 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;
? ? }
}

熵遞減算法的說(shuō)明:

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

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

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

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

項(xiàng)目場(chǎng)景

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

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

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

問(wèn)題描述

會(huì)進(jìn)入死循環(huán)

原因分析

就類似for循環(huán),或者遞歸函數(shù)如果沒(méi)有退出條件就會(huì)一直執(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;
? ? ? ? ? ? }
? ? ? ? }

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • TypeScript中函數(shù)重載寫法

    TypeScript中函數(shù)重載寫法

    這篇文章主要介紹了TypeScript中函數(shù)重載寫法,TypeScript 提供了函數(shù)重載功能,下面文章圍繞TypeScript函數(shù)重載續(xù)航管資料展開(kāi)內(nèi)容,具有一定得參考價(jià)值,需要的朋友可以參考一下
    2021-12-12
  • 利用ThreeJS實(shí)現(xiàn)孔明燈效果

    利用ThreeJS實(shí)現(xiàn)孔明燈效果

    這篇文章主要為大家詳細(xì)介紹了如何利用Three.js實(shí)現(xiàn)3D圣誕節(jié)孔明燈效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手嘗試一下
    2022-12-12
  • JS數(shù)組中filter方法的使用實(shí)例

    JS數(shù)組中filter方法的使用實(shí)例

    在數(shù)組的使用中我們通常會(huì)有數(shù)組的過(guò)濾的需求,比如值在某個(gè)范圍內(nèi)的數(shù)字,用來(lái)組成一個(gè)新的數(shù)組,這就用到了數(shù)組的過(guò)濾,下面這篇文章主要給大家介紹了關(guān)于JS數(shù)組中filter方法使用的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • IE下使用cloneNode注意事項(xiàng)分享

    IE下使用cloneNode注意事項(xiàng)分享

    在開(kāi)發(fā)百度“地裂特效”時(shí),發(fā)現(xiàn)了一些匪夷所思的 bug,第一反應(yīng)是特效本身的代碼與頁(yè)面上原有的腳本發(fā)生了沖突,經(jīng)過(guò)調(diào)試發(fā)現(xiàn),問(wèn)題出現(xiàn)在 cloneNode 的應(yīng)用上
    2012-11-11
  • 在JS數(shù)組特定索引處指定位置插入元素

    在JS數(shù)組特定索引處指定位置插入元素

    最近我碰到了這樣一個(gè)需求: 將一個(gè)元素插入到現(xiàn)有數(shù)組的特定索引處,下面是具體的實(shí)現(xiàn),需要的朋友不要錯(cuò)過(guò)
    2014-07-07
  • 關(guān)于uniapp微信小程序左上角返回按鈕的監(jiān)聽(tīng)詳解

    關(guān)于uniapp微信小程序左上角返回按鈕的監(jiān)聽(tīng)詳解

    uniapp是一個(gè)支持多端的技術(shù),因此它是兼容性比較強(qiáng)的,而且速度也很快,下面這篇文章主要給大家介紹了關(guān)于uniapp微信小程序左上角返回按鈕監(jiān)聽(tīng)的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • 微信小程序自定義組件實(shí)現(xiàn)多選功能

    微信小程序自定義組件實(shí)現(xiàn)多選功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序自定義組件實(shí)現(xiàn)多選功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • TypeScript類型推論與類型斷言實(shí)例詳解

    TypeScript類型推論與類型斷言實(shí)例詳解

    如果沒(méi)有明確的指定類型,那么TypeScript會(huì)依照類型推論(Type Inference)的規(guī)則推斷出一個(gè)類型,下面這篇文章主要給大家介紹了關(guān)于TypeScript類型推論與類型斷言的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • 僅用[]()+!等符號(hào)就足以實(shí)現(xiàn)幾乎任意Javascript代碼

    僅用[]()+!等符號(hào)就足以實(shí)現(xiàn)幾乎任意Javascript代碼

    僅用一些符號(hào)就足以實(shí)現(xiàn)幾乎任意Javascript代碼的方法,比較怪異,對(duì)于特殊需要可能用得到。
    2010-03-03
  • element-ui上傳一張圖片后隱藏上傳按鈕功能

    element-ui上傳一張圖片后隱藏上傳按鈕功能

    這篇文章主要介紹了element-ui上傳一張圖片后隱藏上傳按鈕功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-05-05

最新評(píng)論