Чому JS вважається однопотоковим?
Коротко
"Однопотоковий" означає, що в один момент у стеку викликів (Call Stack) перебуває і виконується тільки один фрагмент коду.
Не можна одночасно обчислювати щось одне і, наприклад, обробляти подію - нове завдання почнеться тільки після завершення попереднього.
Приклад - послідовне виконання
console.log('A');
console.log('B');
console.log('C');Вивід:
A
B
CJS іде порядково: поки не виконається A, B не почнеться.
Усе відбувається в одному потоці.
Що це означає технічно
У рушії JavaScript (наприклад, V8) є:
- Call Stack - стек викликів (код, що виконується);
- Event Loop - цикл подій, який керує асинхронними завданнями;
- Callback Queue / Microtask Queue - черги колбеків і промісів.
Але все це обслуговує один потік виконання коду.
Асинхронні завдання (мережеві запити, таймери тощо) не виконуються всередині JS - ними займається браузер (Web API) або Node.js API, а JS просто отримує повідомлення, коли результат готовий.
Приклад з асинхронністю (щоб побачити "однопотоковість")
console.log('1');
setTimeout(() => console.log('2'), 0);
console.log('3');Вивід:
1
3
2Чому?
- JS спочатку виконує синхронний код (
1,3); - потім, коли стек порожній, Event Loop бере завдання з черги (
2).
Навіть із setTimeout(..., 0) - JS не робить дві справи одночасно.
Чому це важливо
Однопотоковість означає:
- Простоту коду - немає гонок даних і складної синхронізації;
- Обмеження - тривалі операції (наприклад, цикли, обчислення) блокують усе: інтерфейс користувача "зависає".
А як же "багатопотоковість" у браузері?
Хоча сам JS - однопотоковий, браузер і Node.js мають інші потоки (поза JS-рушієм):
- мережеві запити (XHR, fetch);
- таймери (
setTimeout); - файлова система (у Node.js);
- Web Workers (фоновий потік, але з обмеженнями - без спільного стану).
JS просто отримує результати з цих потоків, але сам виконує код тільки в одному.
Візуально
┌───────────────┐
│ Call Stack │ ← виконується рівно один шматок коду
└───────────────┘
↑
┌──────────────────────┐
│ Event Loop │ ← перевіряє, чи вільний стек
└──────────────────────┘
↑
┌──────────────────────┐
│ Callback / Microtask │ ← асинхронні завдання чекають своєї черги
└──────────────────────┘ПІДСУМОК
| Термін | Що означає |
|---|---|
| Однопотоковий | JS виконує код послідовно, в одному потоці |
| Асинхронність | Досягається за рахунок Event Loop і черг |
| Web API / Node API | Обробляють завдання паралельно, але поза рушієм JS |
| Багатопотоковість | Тільки через Web Workers, без доступу до спільних даних |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.