function* generatorFunction() { /* ... */ }
function* generatorFunction() {
yield 42;
}
const generator = generatorFunction();
generator === generator[Symbol.iterator]();
// 다음과 같은 방식으로 구현됨
// generator[Symbol.iterator] = () => this;
yield는 제너레이터 함수의 실행 일시적 정지
yield 뒤에 오는 표현식은 caller에 반환
return 과 유사
yield 부분에서 다음 statement로 진행 여부는 next로 재개할 수 있음
next를 programmitically하게 호출하게 하기 위해서는 재귀 호출을 하면 됨
function* sampleGFunction() {
console.log(yield 10);
console.log(yield 5);
console.log(yield 0);
}
function run(gen) {
const it = gen();
(function iterate({ value, done }) {
if (done) {
return value;
}
if (value % 2 === 0) {
iterate(it.next(value + 1));
} else {
iterate(it.next(value));
}
})(it.next());
}
run(sampleGFunction);
// 11
// 5
// 1