Spec-Zone.ru › JavaScript

yield

Базовый уровень Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с сентября 2016 года.

Оператор yield используется для приостановки и возобновления функции-генератора.

Попробовать

function* foo(index) {
  while (index < 2) {
    yield index;
    index++;
  }
}

const iterator = foo(0);

console.log(iterator.next().value);
// Expected output: 0

console.log(iterator.next().value);
// Expected output: 1

Синтаксис

yield
yield expression

Параметры

expression Необязательно
Значение, которое будет выдано функцией-генератором через протокол итератора. Если опущено, выдаётся undefined.

Возвращаемое значение

Возвращает необязательное значение, переданное методу next() генератора для возобновления его выполнения.

Примечание: Это означает, что next() является асимметричным: он всегда отправляет значение текущему приостановленному yield, но возвращает операнд следующего yield. Аргумент, переданный при первом вызове next(), не может быть получен, поскольку нет текущего приостановленного yield.

Описание

Ключевое слово yield приостанавливает выполнение функции-генератора, и значение выражения, следующего за ключевым словом yield, возвращается вызывающей стороне генератора. Его можно рассматривать как версию ключевого слова return на основе генераторов.

yield может использоваться только непосредственно внутри функции-генератора, которая его содержит. Его нельзя использовать внутри вложенных функций.

Вызов функции-генератора конструирует объект Generator. Каждый раз, когда вызывается метод next() генератора, генератор возобновляет выполнение и работает до тех пор, пока не достигнет одного из следующих:

  • Выражение yield. В этом случае генератор приостанавливается, а метод next() возвращает объект результата итератора с двумя свойствами: value и done. Свойство value является значением выражения после оператора yield, а done — это false, что указывает на то, что функция-генератор ещё не завершена.
  • Конец функции-генератора. В этом случае выполнение генератора завершается, и метод next() возвращает объект результата итератора, где value — это undefined, а done — это true.
  • Оператор return. В этом случае выполнение генератора завершается, и метод next() возвращает объект результата итератора, где value — это указанное возвращаемое значение, а done — это true.
  • Оператор throw. В этом случае выполнение генератора полностью прекращается, и метод next() выбрасывает указанное исключение.

После приостановки на выражении yield выполнение кода генератора остаётся приостановленным до тех пор, пока снова не будет вызван метод next() генератора. Если необязательное значение передаётся методу next() генератора, это значение становится значением, возвращаемым текущей операцией yield генератора. Первый вызов next() не имеет соответствующей приостановленной операции yield, поэтому невозможно получить аргумент, переданный при первом вызове next().

Если вызывается метод return() или throw() генератора, это действует так, как если бы оператор return или throw был выполнен на приостановленном выражении yield. Вы можете использовать try...catch...finally внутри тела функции-генератора для обработки этих преждевременных завершений. Если метод return() или throw() вызывается, но нет приостановленного выражения yield (потому что next() ещё не был вызван, или потому что генератор уже завершён), то преждевременные завершения не могут быть обработаны и всегда приводят к завершению генератора.

Примеры

Использование yield

Следующий код представляет собой объявление примера функции-генератора.

function* countAppleSales() {
  const saleList = [3, 7, 5];
  for (const sale of saleList) {
    yield sale;
  }
}

После того как функция-генератор определена, её можно использовать, создав итератор, как показано ниже.

const appleStore = countAppleSales(); // Generator { }
console.log(appleStore.next()); // { value: 3, done: false }
console.log(appleStore.next()); // { value: 7, done: false }
console.log(appleStore.next()); // { value: 5, done: false }
console.log(appleStore.next()); // { value: undefined, done: true }

Вы также можете отправить значение с помощью next(value) в генератор. step оценивается как возвращаемое значение выражения yield — хотя значение, переданное методу next() генератора при первом вызове next(), игнорируется.

function* counter(value) {
  while (true) {
    const step = yield value++;

    if (step) {
      value += step;
    }
  }
}

const generatorFunc = counter(0);
console.log(generatorFunc.next().value); // 0
console.log(generatorFunc.next().value); // 1
console.log(generatorFunc.next().value); // 2
console.log(generatorFunc.next().value); // 3
console.log(generatorFunc.next(10).value); // 14
console.log(generatorFunc.next().value); // 15
console.log(generatorFunc.next(10).value); // 26

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# prod-YieldExpression

Совместимость с браузерами

Настольные Мобильные Серверные
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
yield
39
12
26Начиная с Firefox 33, синтаксический анализ выражения yield был обновлен в соответствии со спецификацией ES2015.
Начиная с Firefox 29, для завершенной функции-генератора возвращается объект IteratorResult.
26
10
39
26Начиная с Firefox for Android 33, синтаксический анализ выражения yield был обновлен в соответствии со спецификацией ES2015.
Начиная с Firefox for Android 29, для завершенной функции-генератора возвращается объект IteratorResult.
26
10
4.0
39
10
1.0.0
1.0
4.0.0

Смотрите также

  • Протоколы итерации
  • function*
  • выражение function*
  • yield*

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API