yield

This article needs an editorial review. How you can help.

Resum

La paraula clau yield s'utilitza per a pausar i reprendre una funció generadora (function* o bé una funció generadora obsoleta).

Sintaxi

 yield [[expressió]];
expressió
La expresssió a retornar. Si s'omet es retorna undefined.

Descripció

La paraula clau yield causa que l'execució d'una funció generadora es pausi i retorni el valor de l'expressió que la segueix. La paraula clau yield es pot entendre com una versió de la paraula clau return per a generadors.

La paraula clau yield retorna en realitat un objecte de tipus IteratorResult amb dues propietats: value i done. La propietat value és el resultat d'evaluar l'expresssió que segueix yield mentre que la propietat done és de tipus booleà i indica si la funció generadora ha completat la seva execució o no.

Un cop pausada mitjançant una expressió yield, l'execució de codi del generador no es reprendrà a no ser que s'invoqui externament mitjançant la crida a la funció next() del generador. Això permet un control directe de l'execució del generador i valors de retorn incrementals.

Exemples

El següent codi és un exemple de la declaració d'una funció generadora al llarg d'una funció d'ajut.

function* foo(){
  var index = 0;
  while (index <= 2) // quan index arriba a 3, 
                     // la propietat done del yield serà true 
                     // i el seu valor serà undefined;
    yield index++;
}

Un cop la funció generadora és definida es pot utilitzar tot construïnt un iterador tal i com es mostra a continuació:

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 }

Especificacions

Especificació Estat Comentaris
ECMAScript 6 (ECMA-262)
The definition of 'Yield' in that specification.
Release Candidate Definició inicial

Compatibilitat amb navegadors

Característica Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Suport bàsic 39 26.0 (26.0) ? ? ?
Objecte IteratorResult en comptes de throwing ? 29.0 (29.0) ? ? ?
Característica Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Suport bàsic yes (when?) 26.0 (26.0) ? ? ?
Objecte IteratorResult en comptes de throwing ? 29.0 (29.0) ? ? ?

Notes específiques per a Firefox

  • A partir de Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) la funció generadora, un cop completada, no llença un TypeError "generator has already finished" sino que retorna un objecte de tipus IteratorResult com per exemple { value: undefined, done: true } (errada 958951).
  • A partir de Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30) l'anàlisi de l'expressió que segueix al yield s'ha actualitzat per a satisfer l'especificació de ES6 (errada 981599):
    • L'expressió que segueix la paraula clau yield és opcional i si s'omet ja no es llença SyntaxError: function* foo() { yield; }

Vegeu tambè

Document Tags and Contributors

 Contributors to this page: teoli, enTropy
 Last updated by: teoli,