Yield всередині () => {}
Коротка відповідь:
Ні, оператор
yieldне можна використовувати всередині стрілкових функцій.
Розберемо чому і як це влаштовано.
1. Причина: стрілкові функції не можуть бути генераторами
Стрілкові функції - це синтаксичний цукор для звичайних функцій,
але вони не мають власного контексту (this, arguments, super, new.target)
і не можуть містити yield, тому що yield дозволений лише в тілі функції-генератора (function*).
Тобто генератор - це окремий тип функції, а стрілкові функції - інший тип, і вони несумісні між собою.
2. Приклад - помилка
const gen = () => {
yield 1; // SyntaxError
};Помилка:
SyntaxError: Unexpected identifier3. Правильний спосіб - звичайна функція-генератор
Якщо потрібен yield, треба оголосити генераторну функцію через function*:
function* gen() {
yield 1;
yield 2;
}або в анонімній формі:
const gen = function* () {
yield 'A';
yield 'B';
};Так можна використовувати yield без помилок.
4. Але стрілкові функції можна використовувати всередині генераторів
Наприклад, як допоміжні колбеки:
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вручну.
Наприклад:
async function* asyncGen() {
yield await Promise.resolve('data');
}Але стрілкову версію на кшталт
const asyncGen = async* () => { ... } // не можнатеж поки не можна - стандарт ES не допускає async* для стрілок.
Підсумок
| Питання | Відповідь |
|---|---|
Чи можна використовувати yield у стрілковій функції? | Ні |
| Чому? | yield допустимий лише в тілі function* (генератора) |
| Альтернатива | Використовувати function* або async function* |
| Чи можна викликати стрілку всередині генератора? | Так, якщо вона не містить yield |
Чи можна зробити стрілковий генератор (*=>)? | Ні, стандартом не передбачено |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.