The yield
keyword is used to pause and resume a generator function (function*
or legacy generator function).
[rv] = yield [expression];
expression
undefined
is returned instead.rv
Returns the optional value passed to the generator's next()
method to resume its execution.
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.
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:
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
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.IteratorResult
is returned to the caller in which the value
is undefined
and done
is true
.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()
, generators offer enormous power and control.
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 }
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 |
Feature | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic support | 39 | Yes | 261 | No | Yes | 10 |
IteratorResult object instead of throwing |
? | ? | 29 | No | ? | 10 |
Feature | Android webview | Chrome for Android | Edge mobile | Firefox for Android | Opera Android | iOS Safari | Samsung Internet |
---|---|---|---|---|---|---|---|
Basic support | 39 | 39 | Yes | 261 | Yes | 10 | ? |
IteratorResult object instead of throwing |
? | ? | ? | 29 | ? | 10 | ? |
1. Starting with Firefox 33, the parsing of the yield
expression has been updated to conform with the ES2015 specification.
TypeError
"generator has already finished". Instead, it returns an IteratorResult
object like { value: undefined, done: true }
(bug 958951).yield
expression has been updated to conform with the ES2015 specification (bug 981599): yield
keyword is optional and omitting it no longer throws a SyntaxError
: function* countAppleSales() { yield; }
© 2005–2018 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield