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

Deklaracja function*  (Słowo kluczowe function przed gwiazdką) definiuje funkcję generatora, która zwraca obiekt {{jsxref("Obiekty/Generator","Generator")}}.

Możesz także zdefinować funkcje generatora używając konstruktora {{jsxref("GeneratorFunction")}} oraz {{jsxref("Operators/function*", "function* expression")}}.

Składnia

function* name([param[, param[, ... param]]]) {
   statements
}
name
Nazwa funkcji.
param
Nazwa argumentu przekazywanego do funkcji. Funkcja może posiadać maksymalnie 255 argumentów.
statements
Polecenia wypełniające ciało funkcji.

Opis

Generatory są specyficznym rodzajem funkcji, która może być zatrzymywana i wznawiana. Pomiędzy kolejnymi wznowieniami zachowany jest kontekst (variable bindings).

Wywołanie funkcji generatora nie wykonuje poleceń w niej zawartych od razu; Zamiast tego, zwracany jest obiekt iteratora. Dopiero kiedy na iteratorze wywoływana jest metoda next() wykonywane jest ciało funkcji, do momentu wystąpienia pierwszego wyrażenia {{jsxref("Operators/yield", "yield")}}. {{jsxref("Operators/yield", "yield")}} Określa jaka wartość zostanie zwrócona z generatora lub, jeśli użyto {{jsxref("Operators/yield*", "yield*")}}, wskazuje na kolejny do wywołania generator. Metoda next() zwraca obiekt z właściwością value zawierającą zwróconą przez {{jsxref("Operators/yield", "yield")}} wartość oraz właściowść done , która wskazuje czy generator zwórcił już wartość ostatniego {{jsxref("Operators/yield", "yield")}}. Wywołanie metody next() z argumentem, będzie wznawiało wykonywanie generatora za miejscem gdzie występował {{jsxref("Operators/yield", "yield")}} wstrzymujący generator.

Przykłady

Prosty przykład

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

Przykład z 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

Przekazywanie parametrów do generatora

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

Wyrażenie return wewnątrz generatora

function* yieldAndReturn() {
  yield "Y";
  return "R";
  yield "unreachable";
}

var gen = yieldAndReturn()
console.log(gen.next()); // { value: "Y", done: false }
console.log(gen.next()); // { value: "R", done: true }
console.log(gen.next()); // { value: undefined, done: true }

Generator nie jest typowym konstruktorem

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

Specyfikacja

Specification Status Comment
{{SpecName('ES2015', '#', 'function*')}} {{Spec2('ES2015')}} Initial definition.
{{SpecName('ES2016', '#', 'function*')}} {{Spec2('ES2016')}} Changed that generators should not have [[Construct]] trap and will throw when used with new.
{{SpecName('ESDraft', '#', 'function*')}} {{Spec2('ESDraft')}}  

Kompatybilność przeglądarek

{{CompatibilityTable}}
Feature Chrome Firefox (Gecko) Internet Explorer  Edge Opera Safari (WebKit)
Basic support {{CompatChrome(39.0)}} {{CompatGeckoDesktop("26.0")}} {{CompatNo}} 13 26 {{CompatSafari("10")}}
yield* {{CompatVersionUnknown}} {{CompatGeckoDesktop("27.0")}} {{CompatNo}} 13 26 {{CompatSafari("10")}}
IteratorResult object instead of throwing {{CompatVersionUnknown}} {{CompatGeckoDesktop("29.0")}} {{CompatNo}} 13 {{CompatVersionUnknown}} {{CompatUnknown}}
Not constructable with new as per ES2016 {{CompatVersionUnknown}} {{CompatGeckoDesktop("43.0")}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}}
Trailing comma in parameters {{CompatUnknown}} {{CompatGeckoDesktop("52.0")}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}}
Feature Android Android Webview Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
Basic support {{CompatNo}} {{CompatVersionUnknown}} {{CompatGeckoMobile("26.0")}} {{CompatNo}} {{CompatNo}} {{CompatSafari("10")}} {{CompatChrome(39.0)}}
yield* {{CompatNo}} {{CompatVersionUnknown}} {{CompatGeckoMobile("27.0")}} {{CompatNo}} {{CompatNo}} {{CompatSafari("10")}} {{CompatVersionUnknown}}
IteratorResult object instead of throwing {{CompatNo}} {{CompatUnknown}} {{CompatGeckoMobile("29.0")}} {{CompatNo}} {{CompatNo}} {{CompatUnknown}} {{CompatVersionUnknown}}
Not constructable with new as per ES2016 {{CompatUnknown}} {{CompatUnknown}} {{CompatGeckoMobile("43.0")}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}}
Trailing comma in parameters {{CompatUnknown}} {{CompatUnknown}} {{CompatGeckoMobile("52.0")}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}}

Firefox-specific notes

Generatory i iteratory w Firefox przed wersją 26

Starsze wersje Firefox implementują nieco inną, bardziej archaiczną propozycje specyfikacji. W starszych wersjach definiowanie generatorów odbywało się za pomocą wyłącznie słowa kluczowego function (bez dodatkowej gwiazdki). Tą i wiele innych drobnych różnic można sprawdzić na Legacy generator function.

IteratorResult zwraca obiekt zamiast rzucać wyjątek

Począwszy od silnika Gecko 29 {{geckoRelease(29)}}, zakończony generator nie rzuca już więcej wyjątkami {{jsxref("TypeError")}} "generator has already finished". W zamian za to zwraca obiekt IteratorResult w postaci { value: undefined, done: true } ({{bug(958951)}}).

Zobacz także