как setTimeout предотвращает потенциальный переполнение стека
=============================================================

Пример :

Как использование setTimeout предотвращает потенциальный переполнение стека? Я понимаю концепцию как очереди событий, так и стека, но мне трудно соединить их.

**Заданное время ожидания не приведет к переполнению стека, поскольку оно асинхронно. Он просто поместит обратный вызов в очередь событий, а не заблокирует выполнение.**  
  
**В первом случае:**

setTimeout просто помещает обратный вызов в очередь событий, и родительская функция завершает работу без загрузки стека.  
Несмотря на то, что тайм-аут равен 0 мс, он будет вызван в следующем цикле событий, таким образом, не блокируя код при выполнении.

**Во втором случае:**Родительский вызов дочерней функции, помещающей новую запись в стек, даже если родители не очищены из стека.  
В конце концов, более рекурсивные вызовы могут разрушить стек.



`setTimeout(, 0)` запланировать запуск функции после ее завершения.`nextListItem()` не будет вызываться рекурсивно, но вызывается снова средой JS.

Если вы делаете`var r() = function() { r(); };` функция вызывает себя и переполняет стек. Если вы делаете`var r() = function() { setTimeout(r, 0); };` затем`r()` будет запланировано запустить после`r()` заканчивается, и он будет работать вечно.

Это причина для использования`setTimeout(, 0)` вместо`while` или же`for` перебрать список. Это позволяет браузеру обрабатывать другие события до следующего вызова`nextListItem`, Если список длинный, это позволяет избежать блокировки браузера на длительное время. С другой стороны, если`nextListItem` манипулирует DOM, это намного медленнее, чем делать это за один раз.