The yield keyword is used to pause and resume a generator function (function* or legacy generator function).
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Syntax
[rv] = yield [expression];
expression- Defines the value to return from the generator function via the iterator protocol. If omitted,
undefinedis returned instead. rv-
Returns the optional value passed to the generator's
next()method to resume its execution.
Description
The yield keyword pauses generator function execution 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.
yield can only be called directly from the generator function that contains it. It can't be called from nested functions or from callbacks.
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 timenext()is called, execution resumes with the statement immediately after theyield. throwis 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
IteratorResultis returned to the caller in which thevalueisundefinedanddoneistrue. - A
returnstatement is reached. In this case, execution of the generator ends and anIteratorResultis returned to the caller in which thevalueis the value specified by thereturnstatement anddoneistrue.
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(), generators offer enormous power and control.
Examples
The following code is the declaration of an example generator function.
function* countAppleSales () {
var saleList = [3, 7, 5];
for (var i = 0; i < saleList.length; i++) {
yield saleList[i];
}
}
Once a generator function is defined, it can be used by constructing an iterator as shown.
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 }
Specifications
| Specification | Status | Comment |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Yield' in that specification. |
Standard | Initial definition. |
| ECMAScript Latest Draft (ECMA-262) The definition of 'Yield' in that specification. |
Draft |
Browser compatibility
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
yield | Chrome Full support 39 | Edge Full support Yes | Firefox
Full support
26
| IE No support No | Opera Full support Yes | Safari Full support 10 | WebView Android Full support 39 | Chrome Android Full support 39 | Firefox Android
Full support
26
| Opera Android Full support Yes | Safari iOS Full support 10 | Samsung Internet Android Full support 4.0 | nodejs
Full support
4.0.0
|
IteratorResult object instead of throwing | Chrome ? | Edge ? | Firefox Full support 29 | IE No support No | Opera ? | Safari Full support 10 | WebView Android ? | Chrome Android ? | Firefox Android Full support 29 | Opera Android ? | Safari iOS Full support 10 | Samsung Internet Android ? | nodejs ? |
Legend
- Full support
- Full support
- No support
- No support
- Compatibility unknown
- Compatibility unknown
- See implementation notes.
- See implementation notes.
- User must explicitly enable this feature.
- User must explicitly enable this feature.
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 anIteratorResultobject like{ value: undefined, done: true }(bug 958951). - Starting with Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30), the parsing of the
yieldexpression has been updated to conform with the ES2015 specification (bug 981599):- The expression after the
yieldkeyword is optional and omitting it no longer throws aSyntaxError:function* countAppleSales() { yield; }
- The expression after the