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, обмен сообщениями).