1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
---
title: Generator
slug: Web/JavaScript/Reference/Global_Objects/Generator
tags:
- ECMAScript 2015
- Generator
- JavaScript
- Довідка
- генератор
- застарілий генератор
- застарілий ітератор
translation_of: Web/JavaScript/Reference/Global_Objects/Generator
---
<div>{{JSRef}}</div>
<p>Об'єкт <code><strong>Generator</strong></code> повертається {{jsxref("Statements/function*", "функцією-генератором", "", 1)}} та відповідає як <a href="/uk/docs/Web/JavaScript/Reference/Протоколи_перебору#Протокол_ітерабельного_обєкта">протоколу ітерабельного об'єкта</a>, так і <a href="/uk/docs/Web/JavaScript/Reference/Протоколи_перебору#Протокол_ітератора">протоколу ітератора</a>.</p>
<h2 id="Синтаксис">Синтаксис</h2>
<pre class="syntaxbox">function* gen() {
yield 1;
yield 2;
yield 3;
}
var g = gen(); // "Generator { }"</pre>
<h2 id="Методи">Методи</h2>
<dl>
<dt>{{jsxref("Generator.prototype.next()")}}</dt>
<dd>Повертає значення, видане виразом {{jsxref("Operators/yield", "yield")}}.</dd>
<dt>{{jsxref("Generator.prototype.return()")}}</dt>
<dd>Повертає надане значення та завершує генератор.</dd>
<dt>{{jsxref("Generator.prototype.throw()")}}</dt>
<dd>Викидає помилку у генераторі (також завершує генератор, якщо помилка не була перехоплена всередині генератора).</dd>
</dl>
<h2 id="Приклад">Приклад</h2>
<h3 id="Нескінченний_ітератор">Нескінченний ітератор</h3>
<pre class="brush: js">function* idMaker() {
var index = 0;
while(true)
yield index++;
}
var gen = idMaker(); // "Generator { }"
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
// ...</pre>
<h2 id="Застарілі_обєкти-генератори">Застарілі об'єкти-генератори</h2>
<p>Firefox (SpiderMonkey) також реалізував більш ранню версію генераторів у <a href="/uk/docs/Web/JavaScript/New_in_JavaScript/1.7">JavaScript 1.7</a>, де зірочка (*) у оголошенні функції не була потрібна (ви просто використовували ключове слово <code>yield</code> у тілі функції). Однак, підтримка застарілих генераторів була прибрана, починаючи з Firefox 58 (вийшов 23 січня, 2018) ({{bug(1083482)}}).</p>
<h3 id="Методи_застарілого_генератора">Методи застарілого генератора</h3>
<dl>
<dt><code>Generator.prototype.next() </code>{{non-standard_inline}}</dt>
<dd>Повертає значення, видане виразом {{jsxref("Operators/yield", "yield")}}. Цей метод відповідає методу <code>next()</code> у об'єкті-генераторі ES2015.</dd>
<dt><code>Generator.prototype.close()</code> {{non-standard_inline}}</dt>
<dd>Закриває генератор, таким чином, виклик <code>next()</code> викине помилку <a href="/uk/docs/Archive/Web/StopIteration">StopIteration</a>. Цей метод відповідає методу <code>return()</code> у об'єкті-генераторі ES2015.</dd>
<dt><code>Generator.prototype.send()</code> {{non-standard_inline}}</dt>
<dd>Відсилав значення у генератор. Значення повертається виразом {{jsxref("Operators/yield", "yield")}} та повертає значення, видане наступним виразом {{jsxref("Operators/yield", "yield")}}. Метод <code>send(x)</code> відповідає методу <code>next(x)</code> у об'єкті-генераторі ES2015.</dd>
<dt><strong><code>Generator.</code></strong><code>prototype.</code><strong><code>throw()</code> </strong> {{non-standard_inline}}</dt>
<dd>Викидає помилку у генераторі. Цей метод відповідає методу <code>throw()</code> у об'єкті-генераторі ES2015.</dd>
</dl>
<h3 id="Приклад_застарілого_генератора">Приклад застарілого генератора</h3>
<pre class="brush: js">function* fibonacci() {
var a = yield 1;
yield a * 2;
}
var it = fibonacci();
console.log(it); // "Generator { }"
console.log(it.next()); // 1
console.log(it.send(10)); // 20
console.log(it.close()); // undefined
console.log(it.next()); // викидає StopIteration (бо генератор вже закритий)
</pre>
<h2 id="Специфікації">Специфікації</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Специфікація</th>
<th scope="col">Статус</th>
<th scope="col">Коментар</th>
</tr>
<tr>
<td>{{SpecName('ES2015', '#sec-generator-objects', 'Generator objects')}}</td>
<td>{{Spec2('ES2015')}}</td>
<td>Початкове визначення.</td>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-generator-objects', 'Generator objects')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="Сумісність_з_веб-переглядачами">Сумісність з веб-переглядачами</h2>
<p>{{Compat("javascript.builtins.Generator")}}</p>
<h2 id="Див._також">Див. також</h2>
<h3 id="Застарілі_генератори">Застарілі генератори</h3>
<ul>
<li>{{jsxref("Statements/Legacy_generator_function", "Застаріла функція-генератор", "", 1)}}</li>
<li>{{jsxref("Operators/Legacy_generator_function", "Вираз застарілої функції-генератора", "", 1)}}</li>
<li><a href="/uk/docs/Archive/Web/StopIteration">StopIteration</a></li>
<li><a href="/uk/docs/Web/JavaScript/Reference/Deprecated_and_obsolete_features/The_legacy_Iterator_protocol">Протокол застарілого ітератора</a></li>
</ul>
<h3 id="Генератори_ES2015">Генератори ES2015</h3>
<ul>
<li>{{jsxref("Functions", "Функції", "", 1)}}</li>
<li>{{jsxref("Statements/function", "function")}}</li>
<li>{{jsxref("Operators/function", "функціональний вираз")}}</li>
<li>{{jsxref("Function")}}</li>
<li>{{jsxref("Statements/function*", "function*")}}</li>
<li>{{jsxref("Operators/function*", "вираз function*")}}</li>
<li>{{jsxref("GeneratorFunction")}}</li>
<li><a href="/uk/docs/Web/JavaScript/Reference/Протоколи_перебору">Протоколи перебору</a></li>
</ul>
|