Generator function은 기존 함수 선언(표현)과 다르게 function뒤에 *
키워드가 붙습니다. 그래서 function*
를 키워드로 사용합니다. 제너레이터 함수 형태는 일반 함수 형태처럼
function* 선언문, function* 표현식, GeneratorFunction이 있습니다.
//선언문
function* sports(one){}
//표현식
const book = function*(one){};
//GeneratorFunction
const music = Object.getPrototypeOf(function* (){}).constructor;
const gen = new music();
⇒ 여기서 function* 다음 소괄호를 이어서 작성해도 되고 하나 이상 띄워도 상관없습니다.
일반 함수 선언문과 동일하게 function*
뒤에 함수명을 작성합니다. 제너레이터 함수를 호출하면 함수 블록({ }
) 을 실행한 결과값이 아니라 Generator 오브젝트를 생성하여 반환합니다.
여기서 Generator 오브젝트는 iterator 오브젝트로 next()를 통해 결과값을 받을 수 있습니다.
function* sports(one, two){ yield one + two; }
console.log(typeof sports);//function
const obj = sports(1, 2);
console.log(typeof obj);//object
console.log(obj.next());//{value: 3, done: false}
console.log(typeof sports);
⇒ 제너레이터 함수의 타입은 function 입니다.
const obj = sports(1, 2);
⇒ sports 함수를 호출하면 Generator Object를 생성하여 반환합니다. 이 반환하는 시점에서 함수의 블럭내의 코드를 싱행하지는 않습니다. 그리고 sports함수를 호출할 때 보낸 파라미터는 오브젝트에 설정되어 있습니다.
new 연산자를 사용할 수 없는데 이는 단일 함수로 사용하겠다는 의미입니다.
typeof obj
⇒ Generator 오브젝트의 타입은 object입니다.
obj.next()
⇒ Generator 오브젝트가 iterator 오브젝트이기에 next()함수를 호출할 수 있고 이때 코드가 실행됩니다.