Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Чому JS вважається однопотоковим?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**"Однопотоковий"** означає, що в один момент часу в стеку викликів (Call Stack) перебуває і виконується тільки один фрагмент коду. **Ключове:** не можна одночасно обчислювати щось одне і, наприклад, обробляти подію - нове завдання почнеться тільки після завершення попереднього.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Коротко "Однопотоковий" означає, що в один момент **у стеку викликів (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, без доступу до спільних даних |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.