下面是一個來自 MDN Function scope的例子。我無法理解 theend: 0和其余部分end: 是如何列印的。我原以為console.log("end: " i);永遠不會達到。
function foo(i) {
if (i < 0) return;
console.log("begin: " i);
foo(i - 1);
console.log("end: " i);
}
foo(3);
輸出:
begin: 3
begin: 2
begin: 1
begin: 0
end: 0
end: 1
end: 2
end: 3
uj5u.com熱心網友回復:
所有遞回的訣竅是退出條件。沒有它,該功能將永遠運行或系統記憶體不足。的退出條件foo是if (i < 0) return;。現在因為 javascript 至少在這種情況下是同步運行的,所以它會在繼續執行下一行代碼之前完成它正在做的任何事情。
該函式呼叫自身,foo(i - 1);然后呼叫自身,依此類推,直到滿足退出條件。因此,在遞回呼叫之前放置退出條件是至關重要的。
為了更容易理解,考慮i每個連續呼叫的值:
foo(3)
foo(2)
foo(1)
foo(0) // exit condition is met, ending the recursion
print end 0
print end 1
print end 2
print end 3
uj5u.com熱心網友回復:
如果我要寫:
console.log("begin");
my_custom_function(1);
console.log("end")
然后console.log將開始記錄,然后my_custom_function將被呼叫,my_custom_function完成后它將從上次中斷的地方開始并console.log結束記錄。
完全一樣。
完成foo后,它將回傳呼叫函式(恰好也是foo)并從中斷處繼續。
uj5u.com熱心網友回復:
分塊考慮。下面我添加了顯示實際i值的每個步驟,并在每次遞回時縮進它。您可以看到,在遞回完成后,它將完成對前面每個塊的函式呼叫。
foo(3) {
if (3 < 0) return;
console.log("begin: " 3);
foo(3-1) {
if (2 < 0) return;
console.log("begin: " 2);
foo(2-1) {
if (1 < 0) return;
console.log("begin: " 1);
foo(1-1) {
if (0 < 0) return;
console.log("begin: " 0);
foo(0-1){
if (-1 < 0) return; // Exit recursion
}
console.log("end: " 0);
}
console.log("end: " 1);
}
console.log("end: " 2);
}
console.log("end: " 3);
}
uj5u.com熱心網友回復:
function foo() {
if (i < 0) {
console.log("end: " i);
clearInterval(lauch);//close the interval
} else { // with an else
console.log("begin: " i);
i -= 1;
}
}
var i = 3;//global var
var lauch;
start();
function start () {
lauch = setInterval(foo, 1000); // 1 sec or 1000 millisecondes, the function reaload
}
也許這是您要找的?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/460997.html
標籤:javascript 递归
上一篇:為什么高階函式只呼叫一次
下一篇:通過傳輸n段最大化7段顯示的數量
