--- 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];
expressionundefined.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; }