JavaScript. Подробное руководство, 6-е издание, стр. 178
В некоторых броузерах имеется механизм предотвращения атак типа отказа в обслуживании и случайных зацикливаний, который выводит перед пользователем окно запроса, если сценарий или обработчик события выполняется слишком долго, и позволяет прервать выполнение зациклившегося сценария.
)
Если приложение должно выполнять достаточно сложные вычисления, вызывающие заметные задержки, то перед выполнением таких вычислений следует дать документу возможность полностью загрузиться. Кроме того, полезно предупредить пользователя, что будут производиться длительные вычисления, в процессе которых броузер может не откликаться на его действия. Если есть такая возможность, длительные вычисления следует разбить на несколько подзадач, используя такие методы, как
<b>setTimeout()</b><b>setlnterval(),</b>Стандарт HTML5 определяет управляемую форму параллельного выполнения - механизм фонового потока выполнения под названием «web worker». Web worker - это фоновый поток выполнения, предназначенный для выполнения продолжительных вычислений и предотвращения блокирования пользовательского интерфейса. Программный код, выполняемый в фоновом потоке web worker, не имеет доступа к содержимому документа, к информации, используемой главным потоком выполнения или другими потоками web worker, и может взаимодействовать с главным потоком и другими фоновыми потоками только посредством асинхронных событий. Благодаря этому параллельное выполнение не оказывает влияния на главный поток, а фоновые потоки не меняют базовую однопоточную модель выполнения JavaScript-программ. Подробнее о фоновых потоках выполнения рассказывается в разделе 22.4.
13.3.4. Последовательность выполнения клиентских сценариев
Мы уже знаем, что выполнение JavaScript-программ начинается с этапа выполнения сценариев и затем переходит к этапу выполнения, управляемому событиями.
Этот раздел более подробно описывает последовательность выполнения JavaScript-программ.
1. Веб-броузер создает объект
<b>Document</b><b>Element</b><b>document.readyState</b><b>«loading»</b>2. Когда механизм синтаксического анализа HTML встречает элементы
<b><script>,</b><b>async</b><b>defer</b><b>document.write()</b><b><script></b>3. Когда механизм синтаксического анализа встречает элемент
<b><script>,</b><b>async</b><b>document.write().</b><b><script>,</b>4. По окончании анализа документа значение свойства
<b>document.readyState</b><b>interactive</b>5. Выполняются все сценарии, имеющие атрибут
<b>defer</b><b>document.write()</b>6. Броузер возбуждает событие
<b>«DOMContentLoaded»</b><b>Document</b>7. К этому моменту синтаксический анализ документа завершен, но броузер все еще может ожидать окончания загрузки дополнительного содержимого, такого как изображения. Когда все содержимое будет загружено и все асинхронные сценарии будут выполнены, свойство
<b>document.readyState</b><b>«complete»</b><b>«load»</b><b>Window</b>8. С этого момента будут асинхронно вызываться обработчики событий в ответ на действия пользователя, сетевые операции, истечение таймера и т. д.
Это идеализированная последовательность выполнения, и не все броузеры придерживаются ее в точности. Событие
<b>«load»</b><b>«DOMContentLoaded»</b><b>«load»</b><b>document.readyState</b><b>defer</b><b>async</b><b>loadasync(),</b>