As far as I understood from these two answers:
- Will a recursive 'setTimeout' function call eventually kill the JS Engine
- Does use of recursive process.nexttick let other processes or threads work
when setTimeout is called recursively the stack should not grow but if you open a devtool in either FF or Chrome and run this function:
function recur(n = 10) {
console.trace();
console.log(n, '++++++++++++++++');
if (n > 0) setTimeout(() => recur(--n), 1000);
}
recur()
you'll see the following:
console.trace() debugger eval code:2:11
recur debugger eval code:2
<anonymous> debugger eval code:8
10 ++++++++++++++++ debugger eval code:3:11
console.trace() debugger eval code:2:11
recur debugger eval code:2
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
<anonymous> debugger eval code:8
9 ++++++++++++++++ debugger eval code:3:11
console.trace() debugger eval code:2:11
recur debugger eval code:2
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
<anonymous> debugger eval code:8
8 ++++++++++++++++ debugger eval code:3:11
console.trace() debugger eval code:2:11
recur debugger eval code:2
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
<anonymous> debugger eval code:8
7 ++++++++++++++++ debugger eval code:3:11
console.trace() debugger eval code:2:11
recur debugger eval code:2
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
<anonymous> debugger eval code:8
6 ++++++++++++++++ debugger eval code:3:11
console.trace() debugger eval code:2:11
recur debugger eval code:2
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
<anonymous> debugger eval code:8
5 ++++++++++++++++ debugger eval code:3:11
console.trace() debugger eval code:2:11
recur debugger eval code:2
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
<anonymous> debugger eval code:8
4 ++++++++++++++++ debugger eval code:3:11
console.trace() debugger eval code:2:11
recur debugger eval code:2
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
<anonymous> debugger eval code:8
3 ++++++++++++++++ debugger eval code:3:11
console.trace() debugger eval code:2:11
recur debugger eval code:2
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
<anonymous> debugger eval code:8
2 ++++++++++++++++ debugger eval code:3:11
console.trace() debugger eval code:2:11
recur debugger eval code:2
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
<anonymous> debugger eval code:8
1 ++++++++++++++++ debugger eval code:3:11
console.trace() debugger eval code:2:11
recur debugger eval code:2
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
recur debugger eval code:4
(Async: setTimeout handler)
recur debugger eval code:4
<anonymous> debugger eval code:8
0 ++++++++++++++++
Why is that?