The yield
keyword is used to pause and resume a generator function (function*
or legacy generator function).
Syntax
yield [[expression]];
expression
- The expression to return. If omitted,
undefined
is returned instead.
Description
The yield
keyword causes generator function execution to pause and return the current value of the expression following the yield
keyword. 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 a Boolean indicating whether or not the generator function has fully completed.
Once paused on a yield
expression, code execution for the generator cannot resume unless invoked externally by calling the generator's next()
method. This allows direct control of the generator's execution and incremental return values.
Examples
The following code is the declaration of an example generator function, along with a helper function.
function* foo(){ var index = 0; while (index <= 2) // when index reaches 3, // yield's done will be true // and its value will be undefined; 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 }
Specifications
Specification | Status | Comment |
---|---|---|
ECMAScript 6 (ECMA-262) The definition of 'Yield' in that specification. |
Release Candidate | Initial definition. |
Browser compatibility
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
Basic support | 39 | 26.0 (26.0) | ? | ? | ? |
IteratorResult object instead of throwing |
? | 29.0 (29.0) | ? | ? | ? |
Feature | Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Basic support | yes (when?) | 26.0 (26.0) | ? | ? | ? |
IteratorResult object instead of throwing |
? | 29.0 (29.0) | ? | ? | ? |
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 anIteratorResult
object like{ value: undefined, done: true }
(bug 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 latest ES6 specification (bug 981599):- The expression after the
yield
keyword is optional and omitting it no longer throws aSyntaxError
:function* foo() { yield; }
- The expression after the