2 votes

Fonction d'itération sans utiliser de variables globales

J'ai besoin d'une fonction qui : à la première itération renvoie 0, à chaque itération suivante renvoie le nombre précédent incrémenté de 1, par exemple première itération - 0 deuxième itération - 1 troisième itération - 2

mais le problème est que qu'il ne prend pas d'arguments et qu'il a aussi n'utilise pas de variables globales (ou des variables en dehors de cette fonction).

Avez-vous une idée de la manière de l'implémenter sans utiliser de variables globales ?

4voto

Nina Scholz Points 17120

Vous pourriez prendre une fermeture sur la variable et appeler la fonction retournée.

const fn = (i => () => i++)(0);

console.log(fn());
console.log(fn());
console.log(fn());

1voto

Sohail Ashraf Points 7708

Vous pourriez utiliser Generator pour y parvenir.

La déclaration function* (mot-clé function suivi d'un astérisque) définit une fonction de générateur, qui renvoie un objet Generator.

Les générateurs sont des fonctions qui peuvent être quittées et réintroduites ultérieurement. Leur contexte (liaisons de variables) sera sauvegardé lors des ré-entrées.

function* getNumber() {
    let counter = 0;
    while (true) {
        yield counter++;
    }
}
const generator = getNumber();
console.log(generator.next().value);
console.log(generator.next().value);
console.log(generator.next().value);

1voto

ROOT Points 10329

Vous pouvez envisager d'utiliser le générateur fonctions :

function* increment() {
  let index = 0;
  while (true)
    yield index++;
}

var gen = increment();

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

1voto

vlaz Points 4038

Vous pouvez utiliser Function#bind pour créer une fonction avec un contexte défini de façon permanente. Dans ce cas, vous n'avez pas de variable "globale", puisque vous utilisez simplement la fonction this à l'intérieur de la fonction.

const f = (function iterator() {
  return this.i++;
}).bind({i:0}); //<-- set the conext with an initial value of `i`;

console.log(f());
console.log(f());
console.log(f());
console.log(f());

0voto

Code Maniac Points 29570

Vous pouvez faire quelque chose comme cela en définissant une propriété sur la fonction elle-même

function counter(){
  if(this.count === undefined){
     this.count = -1
  }
  this.count++
  return this.count
}

let count = counter.bind({})

console.log(count())
console.log(count())
console.log(count())
console.log(count())

console.log(this.count)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X