--- title: yield slug: Web/JavaScript/Reference/Operators/yield tags: - ECMAScript 2015 - Generators - Iterator - JavaScript - Operador - Operator translation_of: Web/JavaScript/Reference/Operators/yield ---
A palavra-chave yield é usada para pausar e resumir uma generator function ({{jsxref("Statements/function*", "function*")}} or generator function legada).
[rv] = yield [expressão];
expressãoundefined.rvRetorna o valor opcional passado para o metódo next() do generator e resume sua execução.
A palavra-chave yield pausa a execução de uma generator function e o valor da expressão em frente a palavra-chave yield é retornado para a chamada do generator. Ele pode ser considerado uma versão da palavra-chave return para o generator.
A palavra-chave yield atualmente retorna um objeto do tipo IteratorResult com duas propriedades, value e done. A propriedade value é o resultado da avaliação da expressão yield, e done é false, indicando que a generator function não foi totalmente completada.
Uma vez pausado em uma expressão yield, a execução do código do generator permanece pausado até a próxima chamada do métod next(). Cada vez que o método next() do generator é chamado, o generator resume a execução e roda até atingir um dos seguintes estados:
yield, que causa a pausa do generator novamente e retorna seu novo valor. Na próxima vez que next() for chamado, a execução resumirá com a declaração imediamente após yield.IteratorResult é retornado para onde o generator foi chamado no qual o value é {{jsxref("undefined")}} e done é true.IteratorResult é retornado para onde o generator foi chamado no qual o value é o valor especificado pela declaração return statement e done é true.Se um valor opcional é passado para o método next() do generator, esse valor se torna o valor retornado pela operação yield atual do generator.
Entre o caminho de código do generator, os seus operadores yield, e a habilidade de especificar um novo valor inicial passando isso para o {{jsxref("Generator.prototype.next()")}}, generators oferecem um poder e controle enormes
O código seguinte é a declaração de um exemplo de uma generator function.
function* foo() {
var index = 0;
while (index <= 2)
yield index++;
}
Uma vez que a generator function é definida, isso pode ser usada para construir um iterator como mostrado a seguir:
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 }
| Especificação | Situação | Comentário |
|---|---|---|
| {{SpecName('ES2015', '#', 'Yield')}} | {{Spec2('ES2015')}} | Definição inicial. |
| {{SpecName('ESDraft', '#', 'Yield')}} | {{Spec2('ESDraft')}} |
{{CompatibilityTable}}
| Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
|---|---|---|---|---|---|---|
| Basic support | 39 | {{CompatVersionUnknown}} | {{CompatGeckoDesktop("26.0")}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatSafari("10")}} |
IteratorResult object instead of throwing |
{{CompatUnknown}} | {{CompatUnknown}} | {{CompatGeckoDesktop("29.0")}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatSafari("10")}} |
| Feature | Android | Edge | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|---|
| Basic support | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatGeckoMobile("26.0")}} | {{CompatUnknown}} | {{ CompatUnknown}} | {{CompatSafari("10")}} |
IteratorResult object instead of throwing |
{{CompatUnknown}} | {{CompatUnknown}} | {{CompatGeckoMobile("29.0")}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatSafari("10")}} |
IteratorResult como { value: undefined, done: true } ({{bug(958951)}}).yield foi atualizada para se conformar com a especificação do ES2015 ({{bug(981599)}}):
yield é opcional e omitir isso não invoca mais um {{jsxref("SyntaxError")}}: function* foo() { yield; }