--- title: yield slug: Web/JavaScript/Reference/Operators/yield tags: - ECMAScript 2015 - JavaScript - Ітератор - Оператор - генератори translation_of: Web/JavaScript/Reference/Operators/yield ---
Ключове слово yield
використовується для призупинення та відновлення виконання функції-генератора ({{jsxref("Statements/function*", "function*")}} або застарілої функції-генератора).
[rv] = yield [expression];
expression
undefined
.rv
Отримує необов'язкове значення, передане у метод генератора next()
для відновлення виконання.
Ключове слово yield
призупиняє виконання функції-генератора, а значення виразу, що стоїть після yield
, повертається у інструкцію, що викликала генератор. Його можна уявити як генераторну версію ключового слова return
.
Оператор yield
може викликатись тільки безпосередньо з функції-генератора, яка його містить. Його не можна викликати з вкладених функцій або зворотних викликів.
Ключове слово yield
здійснює виклик метода генератора next()
, повертаючи об'єкт IteratorResult
з двома властивостями, value
та done
. Властивість value
є результатом обчислення виразу yield
, а done
дорівнює false
, вказуючи, що функція-генератор ще не завершена.
Зупинившись на виразі yield
, виконання коду генератора залишається на паузі до виклику методу генератора next()
. Кожний раз, коли викликається метод генератора next()
, генератор відновлює виконання та виконується, поки не досягає чогось з наступного:
yield
, яке змушує генератор знову призупинитись та повертає нове значення генератора. Наступний раз, коли викликатиметься next()
, виконання продовжиться з інструкції, що стоїть одразу після yield
.IteratorResult
повертається з value
, що дорівнює {{jsxref("undefined")}}, та done
, що дорівнює true
.IteratorResult
повертається з value
, що дорівнює значенню, вказаному у return
, та done
, що дорівнює true
.Якщо у метод генератора next()
було передано необов'язкове значення, воно стає значенням, що повертається поточною операцією генератора yield
.
Маючи фрагменти коду, що виконуються генератором, оператори yield
та здатність вказувати нове початкове значення, передаючи його у {{jsxref("Generator.prototype.next()")}}, генератори надають неймовірну потужність та контроль.
Наступний код є оголошенням прикладу функції-генератора.
function* countAppleSales () { var saleList = [3, 7, 5]; for (var i = 0; i < saleList.length; i++) { yield saleList[i]; } }
Як тільки функція-генератор визначена, її можна використовувати, створивши ітератор, як показано нижче.
var 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 }
Специфікація | Статус | Коментар |
---|---|---|
{{SpecName('ES2015', '#prod-YieldExpression', 'Yield')}} | {{Spec2('ES2015')}} | Початкове визначення. |
{{SpecName('ESDraft', '#prod-YieldExpression', 'Yield')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.operators.yield")}}
IteratorResult
у вигляді { value: undefined, done: true }
({{bug(958951)}}).yield
було оновлено для відповідності специфікації ES2015 ({{bug(981599)}}):
yield
є необов'язковим, і його пропуск більше не викидає помилку {{jsxref("SyntaxError")}}: function* countAppleSales() { yield; }