Skip to main content

Чому JS вважається однопотоковим?

Коротко

"Однопотоковий" означає, що в один момент у стеку викликів (Call Stack) перебуває і виконується тільки один фрагмент коду.

Не можна одночасно обчислювати щось одне і, наприклад, обробляти подію - нове завдання почнеться тільки після завершення попереднього.


Приклад - послідовне виконання

javascript
console.log('A'); console.log('B'); console.log('C');

Вивід:

javascript
A B C

JS іде порядково: поки не виконається A, B не почнеться. Усе відбувається в одному потоці.


Що це означає технічно

У рушії JavaScript (наприклад, V8) є:

  • Call Stack - стек викликів (код, що виконується);
  • Event Loop - цикл подій, який керує асинхронними завданнями;
  • Callback Queue / Microtask Queue - черги колбеків і промісів.

Але все це обслуговує один потік виконання коду.

Асинхронні завдання (мережеві запити, таймери тощо) не виконуються всередині JS - ними займається браузер (Web API) або Node.js API, а JS просто отримує повідомлення, коли результат готовий.


Приклад з асинхронністю (щоб побачити "однопотоковість")

javascript
console.log('1'); setTimeout(() => console.log('2'), 0); console.log('3');

Вивід:

javascript
1 3 2

Чому?

  • JS спочатку виконує синхронний код (1, 3);
  • потім, коли стек порожній, Event Loop бере завдання з черги (2).

Навіть із setTimeout(..., 0) - JS не робить дві справи одночасно.


Чому це важливо

Однопотоковість означає:

  • Простоту коду - немає гонок даних і складної синхронізації;
  • Обмеження - тривалі операції (наприклад, цикли, обчислення) блокують усе: інтерфейс користувача "зависає".

А як же "багатопотоковість" у браузері?

Хоча сам JS - однопотоковий, браузер і Node.js мають інші потоки (поза JS-рушієм):

  • мережеві запити (XHR, fetch);
  • таймери (setTimeout);
  • файлова система (у Node.js);
  • Web Workers (фоновий потік, але з обмеженнями - без спільного стану).

JS просто отримує результати з цих потоків, але сам виконує код тільки в одному.


Візуально

javascript
┌───────────────┐ │ Call Stack │ ← виконується рівно один шматок коду └───────────────┘ ↑ ┌──────────────────────┐ │ Event Loop │ ← перевіряє, чи вільний стек └──────────────────────┘ ↑ ┌──────────────────────┐ │ Callback / Microtask │ ← асинхронні завдання чекають своєї черги └──────────────────────┘

ПІДСУМОК

ТермінЩо означає
ОднопотоковийJS виконує код послідовно, в одному потоці
АсинхронністьДосягається за рахунок Event Loop і черг
Web API / Node APIОбробляють завдання паралельно, але поза рушієм JS
БагатопотоковістьТільки через Web Workers, без доступу до спільних даних

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.