--- title: function* slug: Web/JavaScript/Reference/Statements/function* translation_of: Web/JavaScript/Reference/Statements/function* ---
{{jsSidebar("Statements")}}

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*")}}.

Sintassi

function* nome([param[, param[, ... param]]]) {
   istruzioni
}
nome
Il nome della funzione.
param
Gli argomenti passati alla funzione. Una funzione può avere fino a 255 argomenti.
istruzioni
Le istruzioni che compongono il corpo della funzione.

Descrizione

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()

Esempi

Esempio semplice

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
// ...

Esempio con yield*

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

Passare argomenti ai Generatori

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

I generatori non sono costruttori

function* f() {}
var obj = new f; // solleva "TypeError: f is not a constructor"

Specifiche

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')}}  

Compatibilità per i browser

{{CompatibilityTable}}
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}}

Note specifiche per Firefox

Generatori e iteratori in Firefox nelle versioni precedenti alla 26

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 eccezioni

A 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)}}).

Vedi anche