Для выполнения кода JavaScript в браузерах фактически используется однопотоковая обработка. И не имеет значения, браузер ли обрабатывает нажатие на пункт меню, производит ли он генерацию HTML страницы или выполняет Ajax-запрос — каждое событие добавляется в единую очередь. Когда браузер освобождается от выполнения очередной задачи, он получает новую задачу и выполняет ее.
Single Browser Threads
В действительности ни один современный браузер не работает в однопоточном режиме. Например, IE9 и Chrome создают новый процесс ОС для каждой закладки. Однако, все равно существует одна очередь событий для каждой просматриваемой страницы, и в каждый момент времени может выполняться только одна задача. Это крайне необходимо, так как браузер или ваше приложение JavaScript могут изменить генерируемую страницу HTML до, во время или после ее загрузки.
Понятно, что браузер должен ограничивать время выполнения JavaScript-кода на странице. Если скрипт выполняется слишком долго, он блокирует приложение и потенциально может привести к нестабильности ОС. По этой причине вы увидите страшное сообщение браузера "Скрипт не отвечает":
Но как браузер определяет, что скрипт выполняется слишком долго? Как и следовало ожидать, в самых популярных браузерах реализуются различные методы и действуют разные ограничения.
- Internet Explorer ограничивает выполнение JavaScript 5 миллионами операций.
- Firefox использует ограничение по времени в 10 секунд.
- Safari использует ограничение по времени в 5 секунд.
- Chrome не ограничивает выполнение, но определяет, когда браузер аварийно завершает работу или не отвечает.
- Opera не имеет ограничений и выполняет JavaScript неограниченное время. Однако, этот браузер не приводит к нестабильности в системе — вы можете открыть другие закладки или закрыть текущую страницу, выполняющую код.
Некоторые из браузеров позволяют вам настраивать параметры, ограничивающие выполнения JavaScript, но я бы не рекомендовал этого делать.
Так как же мы можем предотвратить оставновку выполнения JavaScript браузером? Лучшее решение — избегать задач с длительным временем выполнения. В идеале каждый обработчик событий не должен выполнялся более нескольких десятков миллисекунд. Задачи с интенсивной обработкой данных, как правило, следует выполнять на сервере и получать обработанные данные при перезагрузке страницы или Ajax-запросом.
Однако, я осознаю, что уменьшения обработки данных на стороне клиента в современных JavaScript-приложений вряд ли возможно. К счастью, существует решение этой проблемы.
Статья основана на публикации "JavaScript Execution and Browser Limits".Категории этой статьи
Опросы, близкие по теме