--- 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ão
undefined
.rv
Retorna 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; }