Ядро языка JavaScript не имеет механизма одновременного исполнения не_ скольких потоков управления, и клиентский язык JavaScript не добавляет та_ кой возможности. JavaScript_код на стороне клиента исполняется в единствен_ ном потоке управления. Синтаксический разбор документа останавливается, по_ ка загружается и исполняется сценарий, а веб_броузер прекращает откликаться на действия пользователя на время исполнения обработчика события.
Исполнение в единственном потоке существенно упрощает разработку сценари_ ев: можно писать программный код, пребывая в полной уверенности, что два об_ работчика событий никогда не запустятся одновременно. Можно манипулиро_ вать содержимым документа, точно зная, что никакой другой поток исполнения не попытается изменить его в то же самое время.
Однако исполнение в единственном потоке накладывает определенные требова_ ния, т. е. сценарии и обработчики событий в JavaScript не должны исполняться слишком долго. Если сценарий производит объемные и интенсивные вычисле_ ния, это вызовет задержку во время загрузки документа, и пользователь не уви_ дит его содержимое, пока сценарий не закончит свою работу. Если продолжи_ тельные по времени операции выполняются в обработчике события, броузер мо_ жет оказаться неспособным откликаться на действия пользователя, заставляя его думать, что программа «зависла».1
Если приложение должно выполнять достаточно сложные вычисления, вызы_ вающие заметные задержки, то перед выполнением таких вычислений следует дать документу возможность полностью загрузиться. Кроме того, полезно преду_ предить пользователя, что будут производиться длительные вычисления, в про_ цессе которых броузер может не откликаться на его действия. Если есть такая возможность, длительные вычисления следует разбить на несколько подзадач, используя такие методы, как setTimeout() и setInterval(), для запуска подзадач в фоновом режиме с одновременным обновлением индикатора хода вычислений, предоставляющего обратную связь с пользователем (см. главу 14).
1 В некоторых броузерах, таких как Firefox, имеются средства предотвращения атак типа отказа в обслуживании и случайных зацикливаний. Благодаря этим средствам в случае, когда сценарий или обработчик события исполняется дли_ тельное время, перед пользователем выводится окно запроса, позволяющее пре_ рвать исполнение зациклившегося кода.