среда, 24 сентября 2014 г.

Как работает Event Loop в JavaSript

JavaScript имеется только один поток выполнения и один стэк, в который помещаются функции в очередь на выполнение. Это означает, что в один момент времени JavaScript может выполнить только одну операцию, другие операции при этом будут ждать своей очереди в стэке, пока их не вызовут.

Помимо стэка в браузерах присутствует особая очередь для работы с WebAPI, такими как: клики, таймауты, AJAX-запросы, веб-воркеры. Функции из этой очереди выполнятся по порядку только после того, как стэк будет полностью очищен. Только после этого они помещаются из очереди в стэк на выполнение. Если в стэке в данный момент находится хотя бы один элемент, то они в стэк попасть не могут. Как раз именно из-за этого вызов функций по таймаута часто бывает не точным по времени, так как функция не может попасть из очереди в стэк, пока он заполнен.

В JavaScript Event Loop работает следующим образом.
Сначала в стэк попадает главная функция сценария, обычно это $(document).ready(function(){...}); Над ней в стэк сверху падают функции, которые она вызывает по порядку их вызова. Параллельно этому, по мере выполнения функций из стэка, в очередь событий браузера попадают клики, таймауты, AJAX-запросы, веб-воркеры. Функции из стэка вызываются идя сверху вниз. По мере выполнения функций из стэка они удаляются из него. Как только стэк полностью очищается в него по очереди по одиночке начинают попадать функции из очереди событий, которые начинают заполнять стэк вызовом своих функции. По мере выполнения этих функций стэк опять очищается, тем самым позволяя попасть в него следующей функции из очереди событий. Таким образом весь процесс повторяется.

Поскольку размер стэка не бесконечен, то рекурсивное выполнение функции может привести к переполнению стэка вызовов. На этот случай в браузере существует защита от переполнения физической памяти компьютера, вызывающая сообщение об ошибке при превышении лимита на вызов рекурсивной функции.


Комментариев нет:

Отправить комментарий