yield
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since ÑенÑÑбÑÑ 2016 г..
ÐлÑÑевое Ñлово yield иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¾ÑÑановки и Ð²Ð¾Ð·Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑнкÑий-генеÑаÑоÑов (function* или legacy generator function).
ÐнÑеÑакÑивнÑй пÑимеÑ
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
СинÑакÑиÑ
[rv] = yield [[вÑÑажение]];
вÑÑажение-
ÐозвÑаÑаемое вÑÑажение. ÐÑли не Ñказано, Ñо возвÑаÑаеÑÑÑ Ð·Ð½Ð°Ñение
undefined. rv-
ÐозвÑаÑÐ°ÐµÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑное знаÑение, коÑоÑое пеÑедаÑÑÑÑ Ð²
next()генеÑаÑоÑа, ÑÑÐ¾Ð±Ñ Ð²Ð¾Ð·Ð¾Ð±Ð½Ð¾Ð²Ð¸ÑÑ ÐµÐ³Ð¾ вÑполнение.
ÐпиÑание
ÐлÑÑевое Ñлово yield вÑзÑÐ²Ð°ÐµÑ Ð¾ÑÑÐ°Ð½Ð¾Ð²ÐºÑ ÑÑнкÑии-генеÑаÑоÑа и возвÑаÑÐ°ÐµÑ ÑекÑÑее знаÑение вÑÑажениÑ, Ñказанного поÑле клÑÑевого Ñлова yield. Ðго можно ÑаÑÑмаÑÑиваÑÑ ÐºÐ°Ðº аналог клÑÑевого Ñлова return в ÑÑнкÑии-генеÑаÑоÑе.
Ðа Ñамом деле клÑÑевое Ñлово yield возвÑаÑÐ°ÐµÑ Ð¾Ð±ÑÐµÐºÑ Ñ Ð´Ð²ÑÐ¼Ñ Ð¿Ð°ÑамеÑÑами, value и done. ÐÑи ÑÑом, value ÑвлÑеÑÑÑ ÑезÑлÑÑаÑом вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле yield, а done ÑказÑваеÑ, бÑла ли завеÑÑена ÑÑнкÑиÑ-генеÑаÑоÑ.
Ðо вÑÐµÐ¼Ñ Ð¾ÑÑановки на опеÑаÑоÑе yield, вÑполнение кода в ÑÑнкÑии-генеÑаÑоÑе не возобновиÑÑÑ, пока не бÑÐ´ÐµÑ Ð²Ñзван меÑод next() возвÑаÑаемого ÑÑнкÑией обÑекÑа-генеÑаÑоÑа. ÐÑо пÑедоÑÑавлÑÐµÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвеннÑй конÑÑÐ¾Ð»Ñ Ð·Ð° вÑполнением генеÑаÑоÑа и возвÑаÑом его знаÑений.
ÐÑимеÑÑ
СледÑÑÑий ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ ÐºÐ¾Ð´Ð° ÑодеÑÐ¶Ð¸Ñ Ð¾Ð¿Ñеделение ÑÑнкÑии-генеÑаÑоÑа и вÑпомогаÑелÑной ÑÑнкÑии:
function* foo() {
var index = 0;
while (index <= 2)
// пÑи доÑÑижении 2, done в yield ÑÑÐ°Ð½ÐµÑ true, а value undefined;
yield index++;
}
ÐоÑле Ñого как Ñело ÑÑнкÑии-генеÑаÑоÑа опÑеделено, оно Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¸ÑеÑаÑоÑа:
var iterator = foo();
console.log(iterator.next()); // { value:0, done:false }
console.log(iterator.next()); // { value:1, done:false }
console.log(iterator.next()); // { value:2, done:false }
console.log(iterator.next()); // { value:undefined, done:true }
СпеÑиÑикаÑии
| Specification |
|---|
| ECMAScript® 2027 Language Specification > # prod-YieldExpression > |