Słowo kluczowe yield jest używane do zatrzymania i powrotu funkcji generatora (function* lub legacy generator function).


[rv] = yield [expression];
Definiuje wartość która ma być zwrócona przez funkcję generatora przez the iterator protocol, jeżeli pominięte, zostanie zwrócone undefined.

Zwraca opcjonalną wartość przekazaną do metody next() generatora, do powrotu do jej wykonania.


The yield keyword causes generator function execution to pause and the value of the expression following the yield keyword is returned to the generator's caller. It can be thought of as a generator-based version of the return keyword.

The yield keyword actually returns an IteratorResult object with two properties, value and done. The value property is the result of evaluating the yield expression, and done is false, indicating that the generator function has not fully completed.

Once paused on a yield expression, the generator's code execution remains paused until the generator's next() method is called. Each time the generator's next() method is called, the generator resumes execution and runs until it reaches one of the following:

  •  A yield, which causes the generator to once again pause and return the generator's new value. The next time next() is called, execution resumes with the statement immediately after the yield.
  • throw (en-US) is used to throw an exception from the generator. This halts execution of the generator entirely, and execution resumes in the caller as is normally the case when an exception is thrown.
  • The end of the generator function is reached; in this case, execution of the generator ends and an IteratorResult is returned to the caller in which the value is undefined and done is true.
  • A return statement is reached. In this case, execution of the generator ends and an IteratorResult is returned to the caller in which the value is the value specified by the return statement and done is true.

If an optional value is passed to the generator's next() method, that value becomes the value returned by the generator's current yield operation.

Between the generator's code path, its yield operators, and the ability to specify a new starting value by passing it to Generator.prototype.next() (en-US), generators offer enormous power and control.


The following code is the declaration of an example generator function.

function* foo() {
  var index = 0;
  while (index <= 2)
    yield index++;

Once a generator function is defined, it can be used by constructing an iterator as shown.

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 }


Browser compatibility

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help! (en-US)

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support 39 26.0 (26.0) ? ? 10
IteratorResult object instead of throwing ? 29.0 (29.0) ? ? 10
Feature Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Yes) 26.0 (26.0) ? ? 10
IteratorResult object instead of throwing ? 29.0 (29.0) ? ? 10

Firefox-specific notes

  • Starting with Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26), the completed generator function no longer throws a TypeError "generator has already finished". Instead, it returns an IteratorResult object like { value: undefined, done: true } (błąd 958951).
  • Starting with Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30), the parsing of the yield expression has been updated to conform with the ES2015 specification (błąd 981599):
    • The expression after the yield keyword is optional and omitting it no longer throws a SyntaxError: function* foo() { yield; }

See also