--- title: function* slug: Web/JavaScript/Referencje/Polecenia/function* translation_of: Web/JavaScript/Reference/Statements/function* ---
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")}}.
function* name([param[, param[, ... param]]]) { statements }
name
param
statements
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.
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* 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 }
function* f() {} var obj = new f; // throws "TypeError: f is not a constructor"
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')}} |
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}} |
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ątekPoczą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)}}).