[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Statements/function* [Back]  [Original]

function* - JavaScript | MDN

Cette page a t traduite partir de l'anglais par la communaut. Vous pouvez contribuer en rejoignant la communaut francophone sur MDN Web Docs.

View in English Always switch to English

function*

Baseline Large disponibilit

Cette fonctionnalit est bien tablie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis septembre 2016.

La dclaration function* (le mot-cl function suivi par un astrisque) permet de dfinir un gnrateur (aussi appel une fonction gnratrice) (un gnrateur est un objet Generator).

Dans cet article

Exemple interactif

function* generator(i) {
  yield i;
  yield i + 10;
}

const gen = generator(10);

console.log(gen.next().value);
// Expected output: 10

console.log(gen.next().value);
// Expected output: 20

Il est galement possible de dfinir un gnrateur en utilisant le constructeur GeneratorFunction et une expression function*.

Syntaxe

js
function* nom([param1[, param2[,  paramN]]]) {
  instructions
}
nom

Le nom de la fonction.

paramN

Le nom d'un paramtre formel pass la fonction.

instructions

Les instructions qui constituent le corps de la fonction.

Description

Les gnrateurs sont des fonctions qu'il est possible de quitter puis de reprendre. Le contexte d'un gnrateur (les liaisons avec ses variables) est sauvegard entre les reprises successives.

Les gnrateurs, combins avec les promesses, sont des outils de programmation asynchrones puissants qui permettent de rduire les inconvnients causs par les callbacks (fonctions de rappel) et l'inversion de contrle.

Lorsqu'on appelle une fonction gnratrice, son corps n'est pas excut immdiatement, c'est un itrateur qui est renvoy pour la fonction. Lorsque la mthode next() de l'itrateur est appele, le corps de la fonction gnratrice est utilis jusqu' ce que la premire expression yield soit trouve. Cette expression dfinira la valeur renvoyer pour l'itrateur. Si on utilise yield*, on pourra dlguer la gnration des valeurs une autre fonction gnratrice. La mthode next() renvoie un objet dont la proprit value contient la valeur gnre et une proprit done qui indique si le gnrateur a produit sa dernire valeur ou non. Lorsqu'on appelle la mthode next() avec un argument, cela reprendra l'excution de la fonction gnratrice et remplacera la valeur de l'expression yield (l o l'excution avait t interrompue) avec la valeur de l'argument pass next().

On peut utiliser une instruction return dans un gnrateur. Lorsque cette instruction sera excute, le gnrateur sera termin (done vaudra true). La valeur renvoye par l'instruction return sera la valeur de terminaison du gnrateur. Une fois qu'un gnrateur est termin, il ne peut plus produire d'autres valeurs.

l'instar d'une instruction return, une exception leve l'intrieur du gnrateur entranera la terminaison du gnrateur sauf si cette exception est intercepte. Lorsqu'un gnrateur est termin, les appels suivants next() n'excuteront aucun code provenant du gnrateur, ils renverront simplement un objet de la forme {value: undefined, done: true}.

Exemples

Exemple simple

js
function* creerID() {
  var index = 0;
  while (true) {
    yield index++;
  }
}

var gen = creerID();

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3

Exemple utilisant des arguments

js
function* logGenerator() {
  console.log(yield);
  console.log(yield);
  console.log(yield);
}

var gen = logGenerator();

// le premier appel  next excute la fonction depuis son
// dbut jusqu'au premier yield rencontr
gen.next();
gen.next("bretzel"); // bretzel
gen.next("california"); // california
gen.next("mayonnaise"); // mayonnaise

Exemple utilisant yield*

js
function* autreGenerateur(i) {
  yield i + 1;
  yield i + 2;
  yield i + 3;
}
function* generateur(i) {
  yield i;
  yield* autreGenerateur(i);
  yield i + 10;
}

var gen = generateur(10);

console.log(gen.next().value); // 10
console.log(gen.next().value); // 11
console.log(gen.next().value); // 12
console.log(gen.next().value); // 13
console.log(gen.next().value); // 20

Utilisation de return

js
function* yieldAndReturn() {
  yield "Y";
  return "R";
  yield "inaccessible";
}

var gen = yieldAndReturn();

console.log(gen.next()); // { value: "Y", done: false }
console.log(gen.next()); // { value: "R", done: true }
console.log(gen.next()); // { value: undefined, done: true }

Utiliser un gnrateur comme proprit

js
const monObj = {
  *generator() {
    yield "a";
    yield "b";
  },
};

const gen = monObj.generator();

console.log(gen.next()); // { value: "a", done: false }
console.log(gen.next()); // { value: "b", done: false }
console.log(gen.next()); // { value: undefined, done: true }

Utiliser un gnrateur comme proprit calcule

js
class Toto {
  *[Symbol.iterator]() {
    yield 1;
    yield 2;
  }
}

const monObj = {
  *[Symbol.iterator]() {
    yield "a";
    yield "b";
  },
};

console.log(Array.from(new Toto())); // [1, 2]
console.log(Array.from(monObj)); // [ "a", "b"]

Les gnrateurs ne sont pas constructibles

js
function* f() {}
var obj = new f(); // lve une TypeError: f n'est pas un constructeur

Gnrateur dfini avec une expression

js
const toto = function* () {
  yield 10;
  yield 20;
};
const truc = toto();
console.log(truc.next()); // {value: 10, done: false}

Spcifications

Spcification
ECMAScript 2027 LanguageSpecification
# sec-generator-function-definitions

Compatibilit des navigateurs

Voir aussi


Web Proxy Viewer  |  New URL  |  Original Page