web-dev-qa-db-fra.com

Qu'est-ce que "function *" en JavaScript?

Dans cette page, j'ai trouvé un nouveau type de fonction JavaScript:

// NOTE: "function*" is not supported yet in Firefox.
// Remove the asterisk in order for this code to work in Firefox 13 

function* fibonacci() { // !!! this is the interesting line !!!
    let [prev, curr] = [0, 1];
    for (;;) {
        [prev, curr] = [curr, prev + curr];
        yield curr;
    }
}

Je sais déjà ce que yield, let et [?,?]=[?,?] do , mais n’ai aucune idée de ce que le function* est destinée à être. Qu'Est-ce que c'est?

P.S. ne cherchez pas Google, il est impossible de rechercher des expressions avec des astérisques ( qui sont utilisées comme espaces réservés ).

233
string QNA

C'est une fonction Generator .

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

L'appel d'une fonction génératrice n'exécute pas son corps immédiatement; un objet itérateur de la fonction est renvoyé à la place. Lorsque la méthode next() de l'itérateur est appelée, le corps de la fonction du générateur est exécuté jusqu'à la première expression yield, qui spécifie la valeur à renvoyer par l'itérateur ou, avec yield*, délègue à une autre fonction du générateur.


Note historique:

C'est une syntaxe proposée pour EcmaScript.next.

Dave Herman de Mozilla a parlé de EcmaScript.next . À :15 il parle de générateurs.

Un peu plus tôt, il explique comment Mozilla met en œuvre de manière expérimentale les changements de langue proposés pour aider à diriger le comité. Dave travaille en étroite collaboration avec Brendan Eich, CTO de Mozilla (je pense) et le concepteur JavaScript original.

Vous trouverez plus de détails sur le wiki du groupe de travail EcmaScript: http://wiki.ecmascript.org/doku.php?id=harmony:generators

Le groupe de travail (TC-39) est généralement d'accord sur le fait qu'EcmaScript.next devrait avoir une sorte de proposition d'itérateur de générateur, mais ceci n'est pas définitif.

Vous ne devriez pas vous fier à ce que cela apparaisse sans changements dans la prochaine version du langage, et même si cela ne change pas, cela n'apparaîtra probablement pas largement dans les autres navigateurs avant un certain temps.

Vue d'ensemble

Coroutines de première classe, représentées sous la forme d'objets encapsulant des contextes d'exécution suspendus (c'est-à-dire des activations de fonctions). Etat de la technique: Python, Icône, Lua, Scheme, Smalltalk.

Exemples

La séquence "infinie" de nombres de Fibonacci (nonobstant le comportement autour de 253):

function* fibonacci() {
    let [prev, curr] = [0, 1];
    for (;;) {
        [prev, curr] = [curr, prev + curr];
        yield curr;
    }
}

Les générateurs peuvent être itérés dans des boucles:

for (n of fibonacci()) {
    // truncate the sequence at 1000
    if (n > 1000)
        break;
    print(n);
}

Les générateurs sont des itérateurs:

let seq = fibonacci();
print(seq.next()); // 1
print(seq.next()); // 2
print(seq.next()); // 3
print(seq.next()); // 5
print(seq.next()); // 8
188
Mike Samuel

C'est un fonction de générateur - et c'est ce que dit la page que vous citez, dans le commentaire que vous avez remplacé par "c'est la ligne intéressante" ...

En gros, c’est un moyen de spécifier des séquences par programme de manière à pouvoir les faire circuler et à accéder aux éléments par index sans avoir à calculer au préalable la séquence complète (éventuellement de taille infinie).

49

Le function* type ressemble à une fonction de générateur pour les processus pouvant être itérés. C # a une fonctionnalité comme celle-ci qui utilise "return return" voir 1 et voir 2

En gros, cela renvoie chaque valeur une par une à tout ce qui est itéré de cette fonction, raison pour laquelle leur cas d'utilisation l'affiche dans une boucle de style foreach.

11
invalidsyntax