ES6 생성기 Generator

2601 단어

생성기


생성기(Generators): 스트리퍼를 구축하는 더 좋은 방법입니다. ---생성기와 교체기
생성기는 특수한 함수로서 특수한 점은 다음과 같다.
  • 자면량(함수 성명/함수 표현식)의 키워드 function 뒤에 *이 하나 더 있고 이것* 전후에 공백 문자가 허용됩니다. 예를 들어
  •   function* foo(){}
      function *foo(){}
      function*foo(){}
    
  • 함수체에 yield 연산자
  • 일반 함수의 집행 모드는: 집행-끝, 생성기의 집행 모드는: 집행-일시정지-끝
  • yield 문장


    ield 문장은Generator 함수 내부에서 실행을 멈출 수 있는 문장입니다. ield 문장 뒤의 값은 각종 데이터 형식, 문자열, 정수, 볼 값 등입니다.
    밤송이를 봐라.
      function *foo() {
          yield 1;
          yield 'hello';
          yield 'generator';
          return true;
      }
      let f1 = foo();
      f1.next();  // Object {value: 1, done: false}
      f1.next();  // Object {value: "hello", done: false}
      f1.next();  // Object {value: "generator", done: false}
      f1.next();  // Object {value: true, done: true}
      f1.next();  // Object {value: undefined, done: true}
    

    이 예는 생성기의 기본적인 사용법을 반영하고 다음과 같은 몇 가지 주의할 점이 있다.
  • foo()를 호출할 때 함수체의 논리는 실행되지 않습니다(컨트롤러에 출력이 없습니다), f1을 호출합니다.next () 시 실행됨
  • f1은 하나의 대상입니다. 생성기foo()에서 호출되었습니다.foo()는 f1 대상
  • 을 되돌려 주지 않았습니다.
  • 호출 f1.next () 시, 함수체의 논리가 진정으로 실행되기 시작하고, 호출할 때마다 yield 문장이 끝나고, yield의 연산수를 결과로 되돌려줍니다
  • f1.next () 반환 결과는 하나의 대상입니다. yield의 연산수를 포장하고 done 속성을 가지고 있습니다
  • done 속성이false일 때 이 함수 논리가 아직 실행되지 않았습니다. f1을 호출할 수 있습니다.next () 계속 실행
  • 반환 결과는return 문장 반환 결과이고done 값은true
  • 반환값 중done이true일 때, 계속 호출할 수 있으며, 반환된 값은undefined
  • yield와 return


    밤을 보다.
    function *bar() {
        yield 1;
        yield 'hello';
        return true;
        yield 'generator';
    }
    let b1 = bar();
    b1.next();  // Object {value: 1, done: false}
    b1.next();  // Object {value: "hello", done: false}
    b1.next();  // Object {value: true, done: true}
    b1.next();  // Object {value: undefined, done: true}
    

    위의 예에서 알 수 있듯이return 문장을 만났을 때 되돌아오는 대상의done 속성 값은true이고 반복적으로 끝납니다. 뒤에 yield나return 문장이 있든 없든.일반 함수든Generator 함수든return 문장을 만나면 새로운 값을 되돌려 주지 않습니다.

    yield 및 yield*


    생성기에서 yield*는 yield가 필요한 값을 다른 생성기나 다른 임의의 교체 가능한 대상에 의뢰할 수 있습니다.
    function* gen1() {
      yield 2;
      yield 3;
      yield 4;
    }
    
    function* gen2() {
      yield 1;
      yield* gen1();
      yield 5;
    }
    
    var g = gen2();
    
    g.next(); // Object { value: 1, done: false }
    g.next(); // Object { value: 2, done: false }
    g.next(); // Object { value: 3, done: false }
    g.next(); // Object { value: 4, done: false }
    g.next(); // Object { value: 5, done: false }
    g.next(); // Object { value: undefined, done: true }
    

    좋은 웹페이지 즐겨찾기