생성기 함수(제네레이터 함수 function*)

GoGoDev·2022년 1월 24일
0

JS & TS

목록 보기
8/11

제네레이터

제네레이터 함수는 값을 반환하면 함수가 종료되는 일반 함수와 달리 값을 반환하는데 함수가 종료되지 않기도, 종료되기도 하는 상태를 결정할 수 있다.

function makeInfiniteEnergyGenerator() {
    let energy = 0;
    return function (booster = 0) { // 클로저
        if (booster) {
            energy += booster
        } else {
            energy++;
        }
        return energy;
    }
}


const energy = makeInfiniteEnergyGenerator();

for (let i = 0; i < 5; i++) {
  console.log(energy()); // 1 2 3 4 5
}

console.log(energy(5)); // 10

이 코드는 호출할때마다 1씩 큰 값을 반환하는 함수이다.

제네레이터 함수

function* infiniteEnergyGenerator() {
  let energy = 1;
  while (true) {
    const booster = yield energy;
    if (booster) {
      energy += booster;
    } else {
      energy++;
    }
  }
}


const energy = infiniteEnergyGenerator();

for (let i = 0; i < 5; i++) {
  console.log(energy.next());
}

console.log(energy.next(5));

제네레이터 함수는 function과 함수 이름 사이에 '*' 를 넣는다.
제네레이터 함수의 핵심은 next() 메소드이다. next()는 제네레이터 함수 본체 실행을 재개시킬 수 있는 함수이다.
yield는 제네레이터를 멈추는 키워드이다.

while(true)로 인해 무한루프이지만 next로 호출하기 전까지 yield로 멈춰있다.
멈춰있다가 기존 함수 상태를 그대로 유지하기 때문에 energy 값을 클로저 공간에 넣어두거나 하지 않아도 된다.

결과


제네레이터 함수는 value와 done이라는 속성을 갖는 객체를 반환한다.
done이 true가 될 때는 제네레이터 함수 안에서 return을 만나면 true를 반환한다.
제네레이터 함수 안에 return을 만나면 next가 호출되지만 value는 undefined로 나온다.

profile
🐣차근차근 무럭무럭🐣

0개의 댓글