Асинхронные трассировки стека в Chrome Developer Tools ... разработаны, чтобы держать вас в здравом уме, пытаясь выяснить, почему ваша функция находится в рекурсии setTimeout () l oop
Модель потока javascript - это событие l oop. - https://flaviocopes.com/javascript-event-loop/
setTimeout()
технически не рекурсивно. Это асинхронный вызов функции. Внутри потока он синхронно возвращает идентификатор нумерации c (для него можно вызвать clearTimeout()
), а затем в качестве побочного эффекта добавляет вашу функцию в конец стека событий-l oop. Это однопоточная модель, поэтому, как только javascript завершит ваш текущий поток / событие, он выведет следующую функцию из верхней части стека для выполнения. Таким образом, 1000 мс просто минимальное время для запланированного выполнения, но это может занять больше времени, если он все еще выполняет предыдущие события / потоки.
Если я запускаю этот код в узле, я получаю:
node
Welcome to Node.js v12.5.0.
Type ".help" for more information.
> function recur(n = 10) {
... console.trace();
... console.log(n, '++++++++++++++++');
... if (n > 0) setTimeout(() => recur(--n), 1000);
... }
undefined
>
> recur()
Trace
at recur (repl:2:11)
at repl:1:1
at Script.runInThisContext (vm.js:123:20)
at REPLServer.defaultEval (repl.js:384:29)
at bound (domain.js:415:14)
at REPLServer.runBound [as eval] (domain.js:428:12)
at REPLServer.onLine (repl.js:700:10)
at REPLServer.emit (events.js:205:15)
at REPLServer.EventEmitter.emit (domain.js:471:20)
at REPLServer.Interface._onLine (readline.js:314:10)
10 ++++++++++++++++
undefined
> Trace
at recur (repl:2:11)
at Timeout._onTimeout (repl:4:31)
at listOnTimeout (internal/timers.js:531:17)
at processTimers (internal/timers.js:475:7)
9 ++++++++++++++++
Trace
at recur (repl:2:11)
at Timeout._onTimeout (repl:4:31)
at listOnTimeout (internal/timers.js:531:17)
at processTimers (internal/timers.js:475:7)
8 ++++++++++++++++
Trace
at recur (repl:2:11)
at Timeout._onTimeout (repl:4:31)
at listOnTimeout (internal/timers.js:531:17)
at processTimers (internal/timers.js:475:7)
7 ++++++++++++++++
Trace
at recur (repl:2:11)
at Timeout._onTimeout (repl:4:31)
at listOnTimeout (internal/timers.js:531:17)
at processTimers (internal/timers.js:475:7)
6 ++++++++++++++++
Trace
at recur (repl:2:11)
at Timeout._onTimeout (repl:4:31)
at listOnTimeout (internal/timers.js:531:17)
at processTimers (internal/timers.js:475:7)
5 ++++++++++++++++
Trace
at recur (repl:2:11)
at Timeout._onTimeout (repl:4:31)
at listOnTimeout (internal/timers.js:531:17)
at processTimers (internal/timers.js:475:7)
4 ++++++++++++++++
Trace
at recur (repl:2:11)
at Timeout._onTimeout (repl:4:31)
at listOnTimeout (internal/timers.js:531:17)
at processTimers (internal/timers.js:475:7)
3 ++++++++++++++++
Trace
at recur (repl:2:11)
at Timeout._onTimeout (repl:4:31)
at listOnTimeout (internal/timers.js:531:17)
at processTimers (internal/timers.js:475:7)
2 ++++++++++++++++
Trace
at recur (repl:2:11)
at Timeout._onTimeout (repl:4:31)
at listOnTimeout (internal/timers.js:531:17)
at processTimers (internal/timers.js:475:7)
1 ++++++++++++++++
Trace
at recur (repl:2:11)
at Timeout._onTimeout (repl:4:31)
at listOnTimeout (internal/timers.js:531:17)
at processTimers (internal/timers.js:475:7)
0 ++++++++++++++++