3. Generator는무엇인가?
Generator function 으로반환된값을 Generator Object 라고 하고
이 Generator Obejct 는 iterator 프로토콜을따르고 있다. 즉
[Symbol.iterator] 가 프로퍼티에추가되어있다는것이다. Generator
function 안에서는 yield 라는키워드를사용해서함수내부에작성된코
드를전부실행하지않는다. 제너레이터함수는 yield 를기준으로실행을나
누어서진행한다. iterator 프로토콜을따르고 있기 때문에순차적으로실
행할수있는것이다.
cf> Generator function 를 제너레이터 함수 로, Generator
Object 를 제너레이터 오브젝트 로 표기.
12. 예제 코드를 살펴보자.
function* calc(prev, post) {
let result = 0;
console.log(`Initial result: ${result}`);
result = yield prev + post;
console.log(`Middle result: ${result}`);
result = yield;
console.log(`Last result: ${result}`);
}
let generator = calc(10, 20);
위에서언급한규칙에대한내용을모두담고 있는예제코드이다.
console.log() 에는어떠한값이찍히게 될까? 코드를통해하나씩살펴보
자.
13. console.log(generator.next());
// Initial result: 0
// { value: 30, done: false }
next() 메소드를실행시키면첫번째yield까지실행한다.
초기 result 변수에대한값이출력되고,
expression 으로계산된값인 30 이 value 이출력된다.
아직 yield 가 남았으니 done 은 false 가 되겠다.
15. console.log(generator.next(20));
// Last result: 20
// { value: undefined, done: true }
남은yield가 없으므로brace까지실행한다.
next() 메소드의파라미터로넘겨진 20 이 result 변수에할당된것을
확인할수있다.
더이상 yield 키워드가 없으므로 done 은 true 가 된다.