generator
yield는 제너레이터 함수 안에 존재
next는 함수 밖에서 호출되는 메서드, yield를 순서대로 부름
function* generateSequence() {
yield 1;
yield 2;
return 3;
}
let generator = generateSequence();
console.log(generator.next()); // {value: 1, done: false}
console.log(generator.next());
console.log(generator.next());
console.log(generator.next());
[실행결과]
어디서 많이 봤다.
어디서?
Symbol.iterator() 메소드가 반환하는 값 = interator
const array = [1, 2, 3];
// Symbol.iterator 메소드는 이터레이터를 반환한다.
const iterator = array[Symbol.iterator]();
// iterator는 next 메소드를 갖는다.
// next 메소드는 value, done 속성을 갖는 Result객체를 리턴한다
let iteratorResult = iterator.next();
console.log(iteratorResult); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: 3, done: false}
console.log(iterator.next()); // {value: undefined, done: true}
[실행결과]
그럼 이전에 이터러블이고, 이터레이터인 함수로 피보나치 수열을 만든 소스코드가 있다.
이 소스코드를 제너레이터로 변환 해보자
[이터러블&이터레이터 피보나치 함수]
function fibo(max) {
let [pre, cur] = [0, 1]
return {
[Symbol.iterator]() {
return this
},
next() {
[pre, cur] = [cur, pre+cur]
return {
value : cur,
done : cur <= max
}
}
}
}
let fiboIter = fibo(10);
console.log(fiboIter.next())
console.log(fiboIter.next())
[실행결과]
[제너레이터로 구현한 피보나치 수열 함수]
function* fiboGen(max){
let [pre, cur] = [0, 1]
while(pre+cur <= max){
[pre, cur] = [cur, pre+cur]
yield cur
}
}
let fiboGenIter = fiboGen(10)
console.log(fiboGenIter.next())
console.log(fiboGenIter.next())
console.log(fiboGenIter.next())
console.log(fiboGenIter.next())
console.log(fiboGenIter.next())
console.log(fiboGenIter.next())
[실행결과]
'programming > Javascript' 카테고리의 다른 글
[Javascript] 스코프(Scope), 스코프체인, 렉시컬스코프 (0) | 2022.03.06 |
---|---|
[Javascript] 함수선언문 & 함수표현식 & 화살표함수()=>{} 비교(호이스팅, this 관점에서) (0) | 2022.03.06 |
[Javascript] (iterable 프로토콜, iterator 프로토콜) of [iteration 프로토콜] (0) | 2022.03.05 |
[Javascript] Callback 과 Promise 와 async-await (0) | 2022.03.04 |
[Javascript] 엔진 구조와 동작 방식 (0) | 2022.02.18 |