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?
Réponses
Trop de publicités?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.
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.
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)
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 .
En gros, c'est la même chose que yield return
en C # . :-)