C'est une fonction de générateur .
Les générateurs sont des fonctions qui peuvent être fermées puis ré-entrées. Leur contexte (liaisons variables) sera enregistré à travers les rentrées.
L'appel d'une fonction de générateur n'exécute pas immédiatement son corps; un objet itérateur pour la fonction est renvoyé à la place. Lorsque la next()
méthode de l'itérateur est appelée, le corps de la fonction de générateur est exécuté jusqu'à la première yield
expression, qui spécifie la valeur à renvoyer de l'itérateur ou, avec yield*
, délègue à une autre fonction de générateur.
Note historique:
C'est une syntaxe proposée pour EcmaScript.next
.
Dave Herman de Mozilla a fait une présentation sur EcmaScript.next . A 30h15, il parle de générateurs.
Plus tôt, il explique comment Mozilla met en œuvre expérimentalement 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 d'origine.
Vous pouvez trouver 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 ce n'est pas définitif.
Vous ne devriez pas vous fier à ce que cela apparaisse sans modifications dans la prochaine version de la langue, et même si cela ne change pas, il n'apparaîtra probablement pas largement dans d'autres navigateurs pendant un certain temps.
Aperçu
Coroutines de première classe, représentées comme des objets encapsulant des contextes d'exécution suspendus (c'est-à-dire des activations de fonctions). Art antérieur: Python, Icon, Lua, Scheme, Smalltalk.
Exemples
La séquence «infinie» des nombres de Fibonacci (nonobstant le comportement autour de 2 53 ):
function* fibonacci() {
let [prev, curr] = [0, 1];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
Les générateurs peuvent être répétés en 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
function*
syntaxe est prise en charge dans Firefox depuis la version 26: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… *. Les versions plus anciennes utilisaient une syntaxe différente.