[英]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);
它的意思是:
hi(x)
以獲得其值 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.