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 tipusIteratorResult
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; }
- L'expressió que segueix la paraula clau yield és opcional i si s'omet ja no es llença SyntaxError: