javascript, generator 함수

2020-10-28
  • javascript
  • function * gen() {
      yield 1;
      yield 2;
      yield 3;
    }
    

    이게 뭐야.. ㅠㅠ

    function 예약어 뒤에 * 이 붙은 놈들을 generator function 이라고 한다.

    generator function 이란, generator 객체를 반환하는 함수이다.

    generator function 은 다른 함수들과 다르게 빠져나갔다가 다시 돌아올 수 있는(마치 상태를 기억하고 있는것처럼) 함수이다.

    generator function 은 호출 되면 바로 실행되는것이 아니라 함수를 위한 Iterator 객체를 반환하게 되고,

    Iterator 객체의 next() 를 호출하면, generator function 가 호출되어 진행하다가 yield 를 만날 때 반환되게 된다. (해당 위치를 기억)

    반환되는 객체에는 값을 담은 value 값과 순회를 마쳤는지를 표현하는 boolean 값이 들어 있다. gen().next() = { value: 1, done: false }

    마치 java 의 Iterator 처럼 next().done 을 순회조건으로 보면되고, 순회가 끝나지 않았으면, value 를 사용하면 된다.

    generator function 에서 yield* 것도 볼 수 있는데 해당 구문은 다른 generator function 에게 위임한다는 뜻이다.

    예제를 보자

    ƒunction* gen1(n) {
        yield n+1;
        yield n+2;
        yield n+3;
    }
    ƒunction* gen2(n) {
        yield n+2;
        yield* gen1(n+3);
        yield n+4;
    }
    
    let g = gen1(10);
    g.next(); //{value: 11, done: false}
    g.next(); //{value: 12, done: false}
    g.next(); //{value: 13, done: false}
    g.next(); //{value: undefined, done: true}
    
    g = gen2(10);
    g.next(); //{value: 12, done: false}
    g.next(); //{value: 14, done: false}
    g.next(); //{value: 15, done: false}
    g.next(); //{value: 16, done: false}
    g.next(); //{value: 14, done: false}
    g.next(); //{value: undefined, done: true}
    

    참고

    • [MDN function](https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/function)