PassFront
  1. PassFront
  2. База знаний
  3. DOM и браузер

JavaScript в браузере однопоточный или многопоточный?

DOM и браузер

JavaScript в браузере однопоточный: весь пользовательский код выполняется в одном основном потоке. Асинхронность достигается не потоками, а с помощью Event Loop и Web API браузера.

Что значит однопоточность

Есть один call stack — в каждый момент выполняется только одна операция. Два куска JS не выполняются параллельно в основном потоке.

Как тогда работает асинхронность

Долгие операции (таймеры, сеть, события) обрабатывает браузер вне JS-потока, а по готовности их коллбэки ставятся в очередь. Event Loop выполняет их, когда стек свободен.

console.log('1');
setTimeout(() => console.log('2'), 0); // браузер держит таймер
console.log('3');
// 1, 3, 2

Настоящая многопоточность

Параллельные вычисления возможны через Web Workers — отдельные потоки без доступа к DOM, общаются с основным через сообщения:

const worker = new Worker('worker.js');
worker.postMessage(data);
worker.onmessage = (e) => console.log(e.data);

Почему выбрана однопоточность

Упрощает модель: нет гонок и блокировок при работе с DOM. Плата — тяжёлый синхронный код блокирует UI.

Коротко для собеседования

Основной JS-поток в браузере один. Асинхронность даёт не многопоточность, а Event Loop + Web API. Для реального параллелизма есть Web Workers (без доступа к DOM, обмен сообщениями).

Другие вопросы раздела