簡體   English   中英

遞歸堆棧-Javascript

[英]Recursion stack - Javascript

我正在Javascript中嘗試這種遞歸操作,發現數字以錯誤的順序打印出來(Desc,而我期望是Asc)。 為什么會這樣,我如何可視化流程?

(function hi(x) {
    if (x > 1000) {
        return;
    } else {
        x+=1;
        setTimeout(hi(x), 100000);
        console.log(x);
    }
})(4)

將您的代碼更改為:

(function hi(x) {
    if (x > 1000) {
        return;
    } else {
        x+=1;
        setTimeout(function (){hi(x);}, 100);
        console.log(x);
    }
})(4)

變化在這里:

function (){hi(x);}

這個 :

 setTimeout(hi(x),

立即調用該功能。 你不想要那個。

您需要一個在100000 ms之后運行hi(x)函數

您雖然傳遞給setTimeout的第一個參數是一個函數,但事實並非如此。

當您這樣做時:

setTimeout(hi(x), 100000);

它的意思是:

  1. 計算表達式hi(x)以獲得其值
  2. 100000ms之后,如果上一步的值是

    • 可調用,調用它(如果傳遞則帶有參數)
    • 否則評估它(類似於eval

因此等於:

var ret = hi(x);
setTimeout(ret, 100000);

顯然ret不是您的函數hi ,而是它的返回值undefined 所以setTimout(undefined, 100000)實際上沒有任何意義-100000ms之后eval(undefined)

剝離掉,您的代碼等於:

(function hi(x) {
    if (x > 1000) {
        return;
    } else {
        x+=1;
        hi(x);
        console.log(x);
    }
})(4)

這是什么? 是的, 同步遞歸函數調用。 這就是為什么您看到控制台中的結果遞減計數而不是您期望的原因。

這些解決方案除了將其包裝在匿名函數中之外:

setTimeout(function () {
    hi(x);
}, 100000);

另外,您也可以將額外的參數傳遞給setTimeout

setTimeout(hi, 100000, x);

延遲后傳遞給setTimout參數將在調用它時傳遞給hi

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM