web-dev-qa-db-fra.com

Pourquoi ES6 "produit-il" un mot réservé lorsqu'il est appelé dans ce contexte?

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?

12
Mike Hogan

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.

13
thefourtheye

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));
}
4
Joseph
[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.

1
Eric

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 }

0
ErichBSchulz