You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
이제 제너레이터가 종료되었습니다. 마지막 결과인 `value:3`과 `done:true`를 통해 이를 확인할 수 있습니다.
92
+
이제 제너레이터가 종료되었습니다. 마지막 결과인 `value:3`과 `done:true`를 통해 이를 확인할 수 있습니다.
93
93
94
94
제너레이터가 종료되었기 때문에 지금 상태에선 `generator.next()`를 호출해도 아무 소용이 없습니다. `generator.next()`를 여러번 호출해도 객체 `{done: true}`가 반환될 뿐입니다.
95
95
96
96
```smart header="`function* f(…)`가 맞나요 아니면 `function *f(…)`가 맞나요?"
97
97
둘 다 맞습니다.
98
98
99
99
그런데 `*`는 제너레이터 `함수`를 나타내므로 대개는 첫 번째 문법이 선호됩니다. `*`는 종류를 나타내는 것이지 이름을 나타내는 것이 아니기 때문입니다. 그러므로 `*`는 `function`에 붙이도록 합시다.
100
-
101
-
````
100
+
```
102
101
103
102
## 제너레이터와 이터러블
104
103
@@ -118,13 +117,13 @@ let generator = generateSequence();
118
117
for(let value of generator) {
119
118
alert(value); // 1, 2가 출력됨
120
119
}
121
-
````
120
+
```
122
121
123
122
`.next().value`을 호출하는 것 보다 나아 보이네요.
124
123
125
124
그런데 주의할 점이 있습니다. 위 예시를 실행하면 `1`과 `2`만 출력되고 `3`은 출력되지 않습니다.
126
125
127
-
이유는 `for..of` 이터레이션이 `done: true`일 때 마지막 `value`를 무시하기 때문입니다. 그러므로 `for..of`를 사용했을 때 모든 값이 출력되길 원한다면 `yield`로 값을 반환해야 합니다.
126
+
이유는 `for..of` 이터레이션이 `done: true`일 때 마지막 `value`를 무시하기 때문입니다. 그러므로 `for..of`를 사용했을 때 모든 값이 출력되길 원한다면 `yield`로 값을 반환해야 합니다.
128
127
129
128
```js run
130
129
function*generateSequence() {
@@ -185,9 +184,9 @@ let range = {
185
184
} else {
186
185
return { done:true };
187
186
}
188
-
},
187
+
}
189
188
};
190
-
},
189
+
}
191
190
};
192
191
193
192
// 객체 range를 대상으로 하는 이터레이션은 range.from과 range.to 사이의 숫자를 출력합니다.
@@ -203,15 +202,14 @@ let range = {
203
202
from:1,
204
203
to:5,
205
204
206
-
*[Symbol.iterator]() {
207
-
// [Symbol.iterator]: function*()를 짧게 줄임
205
+
*[Symbol.iterator]() { // [Symbol.iterator]: function*()를 짧게 줄임
208
206
for (let value =this.from; value <=this.to; value++) {
209
207
yield value;
210
208
}
211
-
},
209
+
}
212
210
};
213
211
214
-
alert([...range]); // 1, 2, 3, 4, 5
212
+
alert([...range]); // 1, 2, 3, 4, 5
215
213
```
216
214
217
215
`range[Symbol.iterator]()`는 제너레이터를 반환하고, 제너레이터 메서드는 `for..of`가 동작하는데 필요한 사항(아래 설명)을 충족시키므로 예시가 잘 동작합니다.
@@ -321,7 +319,7 @@ alert(str); // 0..9A..Za..z
321
319
322
320
## 'yield'를 사용해 제너레이터 안·밖으로 정보 교환하기
323
321
324
-
지금까지 배운 제너레이터는 값을 생성해주는 특수 문법을 가진 이터러블 객체와 유사했습니다. 그런데 사실 제너레이터는 더 강력하고 유연한 기능을 제공합니다.
322
+
지금까지 배운 제너레이터는 값을 생성해주는 특수 문법을 가진 이터러블 객체와 유사했습니다. 그런데 사실 제너레이터는 더 강력하고 유연한 기능을 제공합니다.
325
323
326
324
`yield`가 양방향 길과 같은 역할을 하기 때문입니다. `yield`는 결과를 바깥으로 전달할 뿐만 아니라 값을 제너레이터 안으로 전달하기까지 합니다.
327
325
@@ -349,10 +347,10 @@ generator.next(4); // --> 결과를 제너레이터 안으로 전달합니다.
349
347

350
348
351
349
1.`generator.next()`를 처음 호출할 땐 항상 인수가 없어야 합니다. 인수가 넘어오더라도 무시되어야 하죠. `generator.next()`를 호출하면 실행이 시작되고 첫 번째 `yield "2+2=?"`의 결과가 반환됩니다. 이 시점에는 제너레이터가 `(*)`로 표시한 줄에서 실행을 잠시 멈춥니다.
352
-
2. 그 후, 위 그림에서 보듯이 `yield`의 결과가 제너레이터를 호출하는 외부 코드에 있는 변수, `question`에 할당됩니다.
350
+
2. 그 후, 위 그림에서 보듯이 `yield`의 결과가 제너레이터를 호출하는 외부 코드에 있는 변수, `question`에 할당됩니다.
353
351
3. 마지막 줄, `generator.next(4)`에서 제너레이터가 다시 시작되고 `4`는 `result`에 할당됩니다(`let result = 4`).
354
352
355
-
외부 코드에선 `next(4)`를 즉시 호출하지 않고 있다는 점에 주목해 주시기 바랍니다. 제너레이터가 기다려주기 때문에 호출을 나중에 해도 문제가 되지 않습니다.
353
+
외부 코드에선 `next(4)`를 즉시 호출하지 않고 있다는 점에 주목해 주시기 바랍니다. 제너레이터가 기다려주기 때문에 호출을 나중에 해도 문제가 되지 않습니다.
여러 가지 예시를 통해 살펴보았듯이 외부 코드는 `yield`의 결과가 될 값을 제너레이터 안에 전달하기도 합니다.
403
401
404
-
그런데 외부 코드가 에러를 만들거나 던질 수도 있습니다. 에러는 결과의 한 종류이기 때문에 이는 자연스러운 현상입니다.
402
+
그런데 외부 코드가 에러를 만들거나 던질 수도 있습니다. 에러는 결과의 한 종류이기 때문에 이는 자연스러운 현상입니다.
405
403
406
404
에러를 `yield` 안으로 전달하려면 `generator.throw(err)`를 호출해야 합니다. `generator.throw(err)`를 호출하게 되면 `err`는 `yield`가 있는 줄로 던져집니다.
407
405
@@ -466,9 +464,9 @@ function* gen() {
466
464
467
465
constg=gen();
468
466
469
-
g.next(); // { value: 1, done: false }
470
-
g.return("foo"); // { value: "foo", done: true }
471
-
g.next(); // { value: undefined, done: true }
467
+
g.next(); // { value: 1, done: false }
468
+
g.return('foo'); // { value: "foo", done: true }
469
+
g.next(); // { value: undefined, done: true }
472
470
```
473
471
474
472
이미 종료된 제너레이터에서 `generator.return()`을 다시 호출해도 인수로 전달한 값을 그대로 반환합니다([MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator/return)).
0 commit comments