제너레이터 (generator)

엄강우·2022년 6월 13일
0

TIL

목록 보기
35/43

제너레이터란 이터레이터를 사용해 자신의 실행을 제어하는 함수입니다. 일반적인 함수는 매개변수를 받고 값을 반환하지만, 호출자는 매개변수 외에는 함수의 실행을 제어할 방법이 전혀 없습니다. 함수를 호출하면 그 함수가 종료될 때까지 제어권을 넘기지만 제너레이터는 그렇지 않습니다.

특이점

  • 제너레이터는 언제든 호출자에게 제어권을 넘길(yield) 수 있습니다.
  • 제너레이터는 호출한 즉시 실행되지 않습니다. 대신 이터레이터를 반환하고 next() 메서드를 호출함에 따라 실행됩니다.
const *gen = () => {
  yield 1;
  yield 2;
  yield 3;
  return 'finish'  // return 값은 next()를 통해서는 접근 가능하지만 for .. of 로는 접근이 불가 합니다.
}
const iter = gen()
iter.next()  // {value: 1, done: false}
iter.next()  // {value: 2, done: false}
iter.next()  // {value: 3, done: false}
iter.next()  // {value: 'finish' , done: true}

제너레이터 함수는 iterator를 반환 하기 때문에 for ... of, 스프레드, 구조 분해할당 등 iterator를 사용하는 곳 모두 사용할 수 있습니다.

양방향 통신

const *gen = () => {
  const name = yield 'what is your name'
  const color = yield 'what is your favorite color'
  return `My name is ${name}, my favorite color is ${color}`
}
const iter = gen()
iter.next('ethan')  // {value: 'what is your name', done: false}
iter.next('orange') // {value: 'what is your favorite color', done: false}
iter.next()         // {value: 'My name is ethan, my favorite color is orange', done: true}

위의 예와 같이 변수 또한 넘겨 줄 수 있습니다.

profile
안녕하세요 프론트엔드 개발자를 꿈꾸는 엄강우입니다.

0개의 댓글