Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Yield всередині () => {}». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Ні, оператор** `yield` **не можна використовувати всередині стрілкових функцій**, тому що `yield` дозволений лише в тілі функції-генератора (`function*`), а стрілкові функції не можуть бути генераторами. **Ключове:** якщо потрібен `yield`, оголошуй генераторну функцію через `function*`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняКоротка відповідь: > **Ні, оператор** `yield` **не можна використовувати всередині стрілкових функцій.** Розберемо чому і як це влаштовано. --- ## 1. Причина: стрілкові функції не можуть бути генераторами Стрілкові функції - це **синтаксичний цукор для звичайних функцій**, але вони **не мають власного контексту (**`this`**,** `arguments`**,** `super`**,** `new.target`**)** і **не можуть містити** `yield`, тому що `yield` дозволений **лише в тілі функції-генератора** (`function*`). Тобто **генератор** - це **окремий тип функції**, а стрілкові функції - **інший тип**, і вони несумісні між собою. --- ## 2. Приклад - помилка ```javascript const gen = () => { yield 1; // SyntaxError }; ``` Помилка: ```javascript SyntaxError: Unexpected identifier ``` --- ## 3. Правильний спосіб - звичайна функція-генератор Якщо потрібен `yield`, треба оголосити **генераторну функцію** через `function*`: ```javascript function* gen() { yield 1; yield 2; } ``` або в анонімній формі: ```javascript const gen = function* () { yield 'A'; yield 'B'; }; ``` Так можна використовувати `yield` без помилок. --- ## 4. Але стрілкові функції можна використовувати *всередині* генераторів Наприклад, як допоміжні колбеки: ```javascript function* gen() { const nums = [1, 2, 3]; yield nums.map(n => n * 2); // стрілка - ок, без yield всередині } console.log(gen().next().value); // [2, 4, 6] ``` Стрілкова функція тут звичайна, не використовує `yield`, тому все працює. --- ## 5. Якщо потрібна поведінка "як yield" у стрілковій функції Іноді можна обійтися іншими інструментами: - використати `return` у генераторі-обгортці; - використати `async/await` (для асинхронного "yield"); - або `Observable` / `iterator` вручну. Наприклад: ```javascript async function* asyncGen() { yield await Promise.resolve('data'); } ``` Але стрілкову версію на кшталт ```javascript const asyncGen = async* () => { ... } // не можна ``` теж поки **не можна** - стандарт ES не допускає `async*` для стрілок. --- ## Підсумок | Питання | Відповідь | |---|---| | Чи можна використовувати `yield` у стрілковій функції? | Ні | | Чому? | `yield` допустимий лише в тілі `function*` (генератора) | | Альтернатива | Використовувати `function*` або `async function*` | | Чи можна викликати стрілку всередині генератора? | Так, якщо вона не містить `yield` | | Чи можна зробити стрілковий генератор (`*=>`)? | Ні, стандартом не передбачено |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.