--- title: function* slug: Web/JavaScript/Reference/Statements/function* translation_of: Web/JavaScript/Reference/Statements/function* ---
La dichiarazione function*
(la parola chiave function
seguita da un asterisco) definisce una funzione generatrice, la quale restituisce un oggetto di tipo {{jsxref("Global_Objects/Generator","Generator")}}.
{{EmbedInteractiveExample("pages/js/statement-functionasterisk.html")}}
È anche possibile definire una funzione generatrice usando il costrutto {{jsxref("GeneratorFunction")}} e una {{jsxref("Operators/function*", "espressione function*")}}.
function* nome([param[, param[, ... param]]]) { istruzioni }
nome
param
istruzioni
I generatori sono funzioni dalle quali è possibile uscire e poi rientrarvi in un secondo momento. Il loro contesto (binding delle variabili) verrà salvato all'uscita per quando vi entrerà successivamente.
La chiamata ad un generatore non viene eseguita immediatamente; la funzione ritornerà invece un oggetto iterator. Quando il metodo next()
dell'iteratore viene chiamato, il corpo del generatore viene eseguito fino alla prima espressione {{jsxref("Operators/yield", "yield")}}, la quale specifica quale espressione ritornare dall'iteratore oppure, con l'espressione {{jsxref("Operators/yield*", "yield*")}}, delegare questo valore ad un'altra funzione generatrice. Il metodo next()
restituisce un oggetto con proprietà value
contenente il valore da restituito all'iteratore ed una proprietà done
che contiene un valore di tipo boolean per indicare se il generatore ha restituito l'ultimo valore. Chiamando il metodo next()
con un argomento farà riprendere l'esecuzione della funzione generatrice, sostituendo l'istruzione yield
in cui l'esecuzione era stata fermata con l'argomento della funzione next()
.
function* idMaker(){ var index = 0; while(index < 3) yield index++; } var gen = idMaker(); console.log(gen.next().value); // 0 console.log(gen.next().value); // 1 console.log(gen.next().value); // 2 console.log(gen.next().value); // undefined // ...
function* anotherGenerator(i) { yield i + 1; yield i + 2; yield i + 3; } function* generator(i){ yield i; yield* anotherGenerator(i); yield i + 10; } var gen = generator(10); console.log(gen.next().value); // 10 console.log(gen.next().value); // 11 console.log(gen.next().value); // 12 console.log(gen.next().value); // 13 console.log(gen.next().value); // 20
function* logGenerator() { console.log(yield); console.log(yield); console.log(yield); } var gen = logGenerator(); // the first call of next executes from the start of the function // until the first yield statement gen.next(); gen.next('pretzel'); // pretzel gen.next('california'); // california gen.next('mayonnaise'); // mayonnaise
function* f() {} var obj = new f; // solleva "TypeError: f is not a constructor"
Specifica | Stato | Commenti |
---|---|---|
{{SpecName('ES6', '#', 'function*')}} | {{Spec2('ES6')}} | Definizione iniziale |
{{SpecName('ES7', '#', 'function*')}} | {{Spec2('ES7')}} | I generatori non devono avere essere usati come costruttori e deveo lanciare un eccezione quando vengono usati con la parola chiave new . |
{{SpecName('ESDraft', '#', 'function*')}} | {{Spec2('ESDraft')}} |
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Edge | Opera | Safari (WebKit) |
---|---|---|---|---|---|---|
Supporto base | {{CompatChrome(39.0)}} | {{CompatGeckoDesktop("26.0")}} | {{CompatNo}} | 13 | 26 | {{CompatNo}} |
yield* |
{{CompatVersionUnknown}} | {{CompatGeckoDesktop("27.0")}} | {{CompatNo}} | 13 | 26 | {{CompatNo}} |
IteratorResult invece delle eccezioni |
{{CompatVersionUnknown}} | {{CompatGeckoDesktop("29.0")}} | {{CompatNo}} | 13 | {{CompatVersionUnknown}} | {{CompatNo}} |
Non istanziabile con new {ES2016) |
{{CompatVersionUnknown}} | {{CompatGeckoDesktop("43.0")}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} |
Feature | Android | Android Webview | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
---|---|---|---|---|---|---|---|
Supporto base | {{CompatNo}} | {{CompatVersionUnknown}} | {{CompatGeckoMobile("26.0")}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} | {{CompatChrome(39.0)}} |
yield* |
{{CompatNo}} | {{CompatVersionUnknown}} | {{CompatGeckoMobile("27.0")}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} | {{CompatVersionUnknown}} |
IteratorResult invece delle eccezioni |
{{CompatNo}} | {{CompatUnknown}} | {{CompatGeckoMobile("29.0")}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} | {{CompatVersionUnknown}} |
Non istanziabile con new (ES2016) |
{{CompatUnknown}} | {{CompatUnknown}} | {{CompatGeckoMobile("43.0")}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} |
Versioni di FIrefox precedenti implementano una versione più vecchia della proposta di standard per i generatori. Tra le varie differenze, in queste versioni i generatori erano definiti usando la parola chiave function
(senza asterisco) per le funzioni semplici. Per maggiori informazioni fare riferimento a {{jsxref("Statements/Legacy_generator_function", "funzioni generatrici (legacy)")}}.
IteratorResult
al posto delle eccezioniA partire da Gecko 29 {{geckoRelease(29)}}, la funzione generatrice completata non solleva più eccezioni {{jsxref("TypeError")}} "generator has already finished". Restituisce invece oggetti di tipo IteratorResult
come il seguente { value: undefined, done: true }
({{bug(958951)}}).