ES6부터 도입된 제네레이터는 코드 블록의 실행을 일시 중지했다가
필요한 시점에 재개할 수 있는 특수한 함수!
제네레이터와 일반 함수의 차이점은?
- 제네레이터 함수는 함수 호출자에게 함수 실행의 제어권을 양도한다.
일반 함수는 호출하면 제어권이 함수에게 넘어가고 함수 코드를 일괄 실행한다.
함수 호출자는 함수를 호출한 이우 함수 실행은 제어할 수 없음!
하지만 제네레이터 함수는 함수 실행을 함수 호출자가 제어할 수 있다. 함수 시행을 일시 중지 시키거나
재개시킬 수 있으며 함수의 제어권을 함수가 독점하는 것이 아니라 함수 호출자에게 양도 yeild 할 수 있음! - 제네레이터 함수는 함수 호출자와 함수의 상태를 주고받을 수 있다.
일반 함수는 매개변수를 통해 함수 외부에서 값을 주입받고 함수 코드를 실행하여 결괏값을 함수 외부로 반환하는데
이때 함수가 실행되는 동안 함수 외부에서 함수 내부로 값을 전달하여 함수의 상태를 변경할 수 없다.
제네레이터 함수는 함수 호출자와 양방향으로 함수의 상태를 주고받을 수 있으며
제네레이터 함수는 함수 호출자에게 상태를 전달 및 전달받을 수 있다. - 제네레이터 함수를 호출하면 제네레이터 객체를 반환한다.
제네레이터 함수를 호출하면 함수코드를 실행하는 것이 아니라
이 트러블이면서 이터레이터인 제네레이터 객체를 반환한다.
이터러블: 반복,순회 가능한 객체는 배열을 일반화한 객체이며 Symbol.iterator라는 메서드를 가지고 있다,
배열과 문자열이 배열을 통해 순환할 수 있는 이유는 Symbol.iterator 메서드를 가지고 있기 때문
이터레이터 : value, done 프로퍼티를 갖는 리절트 객체를 봔한하는 next 메서드를 소유한 순환 가능한 객체를 말함.
제네레이터는 yeild 키워드와 next메서드를 통해 실행을 일시 중지했다가 필요한 시점에 다시 재개할 수 있다.
제네레이터 함수를 호출하면 제네레이터 함수의 코드 블록이 실행되는 것이 아니라 제네레이터 객체를 반환한다.
제네레이터 객체의 next메소드를 호출하여 함수의 코드블록을 실행한다.
모든 코드 블록을 실행하는 것이 아니라 yield 표현식까지만 실행하며 yeild키워드는 함수의 실행을 일시 중지시키거나
yeild 키워드 뒤에 오는 표현식의 평가 결과를 제네레이터 함수 호출자에게 반환한다.
제네레이터는 이터러블을 쉽게 구현하거나, 비동기 처리를 구현할 때 사용되었는데
비동기 처리를 예시로 보면
try/catch/finally 없이 비동기 처리 결과를 반환하도록 구현할 수 있다고 한다
asnyc 함수가 호출되면 제네레이터 함수가 호출되어 제네레이터 객체를 생성하고 obResovled 함수를 반환한다.
그러면서 next메소드가 호출되고 반환 제네레이터 반환의 done 프로퍼티 값이 true 일 때까지
onResovled를 재귀함수 호출한다.
이렇게 비동기적으로 호출하면 try/catch/finally 없이 구현가능하지만 ES8 async/await 기능의 도입으로
가독성과 비동기 처리를 동기처럼 구현 가능해지면서 사용되지 않고 있는 것 같다?
책: 모던 자바스크립트 deep dive
'javascript' 카테고리의 다른 글
실행 컨텍스트의 평가와 실행, 스택 (0) | 2023.09.23 |
---|---|
모듈의 의미 (0) | 2023.08.23 |
디바운스와 스로틀 (1) | 2023.07.27 |
타이머 함수 (0) | 2023.07.26 |
이벤트 (0) | 2023.07.20 |