J'utilise le noeud 4.1.1. Quand je lance ce code
"use strict";
function *generator() {
let numbers = [1,2,3,4,5];
numbers.map(n => yield (n + 1));
}
for (var n of generator()) {
console.log(n);
}
Je reçois cette erreur
numbers.map(n => yield (n + 1));
^^^^^
SyntaxError: Unexpected strict mode reserved Word
Si je réorganise le code pour être ceci
"use strict";
function *generator() {
let numbers = [1,2,3,4,5];
let higherNumbers = numbers.map(n => n + 1);
for(let i=0;i<higherNumbers.length;i++) {
yield higherNumbers[i];
}
}
for (var n of generator()) {
console.log(n);
}
Je reçois le résultat attendu.
Pourquoi le second fonctionne-t-il et le premier échoue-t-il? Et sûrement si un mot clé est réservé, il est réservé dans tous les contextes, pas seulement lorsqu'il est utilisé dans une fonction de flèche?
C'est parce que les fonctions de flèche ne sont pas des fonctions de générateur. Par exemple,
function temp() {
yield 1;
}
Pouvons-nous nous attendre à ce que cela fonctionne? Non, car temp
n'est pas une fonction génératrice. Il en va de même pour les fonctions de flèche.
FWIW, l'utilisation de yield
dans une fonction Arrow est une erreur précoce conforme à la spécification ECMAScript 2015, selon cette section ,
(ArrowFunction: ArrowParameters => ConciseBody} _
C'est une erreur de syntaxe si ArrowParameters contient YieldExpression est true.
Il s'agit d'une erreur de syntaxe si ConciseBody contient YieldExpression est true.
C'est parce que la fonction de flèche n'est pas un générateur. Si j'élargis votre fonction de flèche, cela ressemblerait à quelque chose comme:
function *generator() { // <-- this is your generator function
let numbers = [1,2,3,4,5];
numbers.map(function(n){ // <-- this one isn't a generator
yield (n + 1) // <-- there's your yield
}.bind(this));
}
[1,2,3,4,5].map(function*(v){yield v+1;}).reduce((accumulator, currentValue) => accumulator = [...accumulator].concat([...currentValue]))
explication...
[1,2,3,4,5].map(function*(v){yield v+1;})
compiler toutes les valeurs dans le générateur résultant
(5) [Générateur, Générateur, Générateur, Générateur, Générateur]
décompresser dans un tableau plat
.reduce((accumulator, currentValue) => accumulator = [...accumulator].concat([...currentValue]))
(5) [2, 3, 4, 5, 6]
pour une utilisation normale
[1,2,3,4,5].map(function*(v){yield v+1;}).forEach(v => console.log([...v][0]))
2
3
4
5
6
[... v] [0] est un peu moche mais ça marche.
Vous venez de découvrir que vous pouvez rencontrer cela en fermant votre fonction par inadvertance trop tôt.
c'est-à-dire un de trop }