298 votes

Quel est le mot-clé de rendement en JavaScript?

J'ai entendu parler d'un mot clé "rendement" en JavaScript, mais j'ai trouvé une documentation très médiocre à ce sujet. Est-ce que quelqu'un peut m'expliquer (ou recommander un site qui explique) son utilisation et son utilisation?

258voto

bishop Points 3309

La fin de la réponse, probablement, tout le monde connaît yield maintenant, mais certains d'une meilleure documentation est venu le long.

"Javascript: Générateurs" par James Long a quelques bons exemples, y compris:

function foo(x) {
    while (true) {
        x = x * 2;
        yield x;
    }
}

Lorsque vous appelez foo, vous obtenez en retour un objet de Générateur qui a une prochaine la méthode.

var g = foo(2);
g.next(); // -> 4
g.next(); // -> 8
g.next(); // -> 16

Donc, yield est le genre de return: vous obtenez quelque chose en retour. return x renvoie la valeur de x, mais yield x retourne une fonction qui vous donne une méthode pour effectuer une itération en vue de la prochaine valeur. Utile si vous avez un potentiellement les plus gourmands en mémoire la procédure que vous pouvez interrompre au cours de l'itération.

84voto

Matt Ball Points 165937

Le MDN documentation est très bonne, de l'OMI.

La fonction contenant le mot clé yield est un générateur. Quand vous l'appelez, ses paramètres formels sont liés à des arguments réels, mais son corps n'est pas réellement évalué. Au lieu de cela, un générateur de itérateur est retourné. Chaque appel au générateur de itérateur de la méthode next() effectue une passe au travers de l'algorithme itératif. Chaque étape de la valeur est la valeur spécifiée par le mot clé yield. Pense de rendement du générateur itérateur de la version de retour, indiquant les limites entre chaque itération de l'algorithme. Chaque moment de l'appel à next(), le générateur de code reprend à partir de l'instruction qui suit le rendement.

19voto

David Points 380

Pour donner une réponse complète: yield de travail est similaire à l' return, mais dans un générateur.

Comme pour l'communément donner l'exemple, cela fonctionne comme suit:

function *squareGen(x) {
    var i;
    for (i = 0; i < x; i++) {
        yield i*i;
    }
}

var gen = squareGen(3);

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

Mais il y a aussi un deuxième but de le mot clé yield. Il peut être utilisé pour envoyer les valeurs de la génératrice.

Pour préciser, un petit exemple:

function *sendStuff() {
    y = yield (0);
    yield y*y;
}

var gen = sendStuff();

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

Cela fonctionne, que la valeur 2 est attribué à l' y, en l'envoyant sur le générateur, après elle s'est arrêtée à la première de rendement (qui a retourné 0).

Cela nous permet de vraiment des trucs funky. (coroutine)

17voto

Matthew Flaschen Points 131723

Il est utilisé pour les générateurs d'itérateurs. Fondamentalement, il vous permet de créer une séquence (potentiellement infinie) en utilisant un code procédural. Voir la documentation de Mozilla .

-5voto

Jakub Šturc Points 12549

En gros, c'est la même chose que yield return en C # . :-)

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