254 votes

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

Dans cette page, j'ai trouvé une nouvelle fonction JavaScript type:

// 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 qu' yield, let et [?,?]=[?,?] le faire, mais n'ont aucune idée de ce que l' function* est destiné à être. Quel est-il?

P. S. n'est pas la peine d'essayer Google, il est impossible de rechercher des expressions avec des astérisques (ils sont utilisés comme des espaces réservés).

210voto

Mike Samuel Points 54712

C'est un projet de syntaxe pour EcmaScript.prochaine.

Dave Herman de Mozilla a donné un exposé sur l' EcmaScript.prochaine. À 30:15 il parle de générateurs. Plus tôt, il explique comment Mozilla est expérimentalement la mise en œuvre des changements de langue pour aider à diriger le comité. Dave travaille en étroite collaboration avec Brendan Eich, CTO de Mozilla (je crois), et l'original JavaScript designer.

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

Le groupe de travail (TC-39) a un accord général pour EcmaScript.la prochaine devrait avoir une sorte de générateur de itérateur proposition, mais ce n'est pas définitive. Vous ne devriez pas compter sur cette montrant sans changements dans la prochaine version de la langue, et même si elle ne change pas, il ne sera probablement pas largement dans les autres navigateurs, pour un temps.

Vue d'ensemble

Première classe coroutines, représentés comme des objets encapsulant suspendu contextes d'exécution (c'est à dire, en fonction des activations). Avant d'art: Python, Icône, Lua, le Schéma, le langage Smalltalk.

Exemples

Le "infini" de la séquence 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é en boucle:

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

52voto

Michael Borgwardt Points 181658

C'est une fonction de générateur - et cela a été dit dans la page que vous citez, dans le commentaire que vous avez remplacé par "ceci est la ligne intéressante" ...

Fondamentalement, c'est un moyen de spécifier des séquences par programmation afin qu'elles puissent être passées et que des éléments soient accessibles par index sans avoir à calculer la séquence entière (éventuellement de taille infinie) au préalable.

11voto

invalidsyntax Points 509

L' function* type ressemble, il agit comme un générateur de fonction pour le processus peut être itéré. C# est une fonctionnalité de ce genre à l'aide de "taux de retour" voir la section 1 et la section 2

Essentiellement, cela renvoie à chaque valeur, un par un, pour ce qui est de l'itération de cette fonction, qui est pourquoi leurs cas d'utilisation montre dans un foreach style de boucle.

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