На странице браузера скрипты выполняются в едином потоке с пользовательским интерфейсом. При объемных вычисления это приводит к «зависанию» - страница перестает реагировать на ввод. Да и сам браузер, замечая такую ситуацию, предлагает ее закрыть.
Обойти эту проблему можно используя асинхронность JavaScript.
Если разбить непрерывное вычисление на блоки, которые запускаются один за другим по таймеру с заданным интервалом, то это решит проблему отзывчивости интерфейса, но все равно будет недоступна вся мощь многоядерного процессора клиента. Задачу вычислений в браузере в отдельном потоке решает Web Worker. Он запускается в собственном глобальном контексте и взаимодействует с основным потоком через сообщения. Продемонстрирую этот функционал на примере игры в шашки на платформе E-Champ с открытым исходным кодом. Как серверная, так и клиентская части E-Champ написаны на JavaScript и используют свободное окружение (Node.js, MongoDB). Игры и боты подключаются к платформе как отдельные npm мод