Skip to main content

Yield всередині () => {}

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

Ні, оператор 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
Чи можна зробити стрілковий генератор (*=>)?Ні, стандартом не передбачено

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

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

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