javascript 언어 확장:대상 교체 가능(3)

앞의 두 편의 글 에서 묘사 한 교체 가능 대상 을 제외 하고 js 언어 확장 에서 의 생 성기 대상 도 교체 가능 대상 으로 할 수 있다.여기에 새로운 키워드 yield 를 사용 합 니 다.이 키 워드 는 함수 내부 에서 사용 되 며,용법 은 return 과 유사 하여 함수 의 값 을 되 돌려 줍 니 다.yield 와 return 의 차 이 는 yield 의 함수'되 돌아 가기'를 사용 하 는 이 값 이 내부 상 태 를 유지 할 수 있다 는 것 입 니 다.(나 도 고양이 의 언어 표 현 력 으로 그것 을 분명하게 표현 할 수 없다.만약 당신 이 ruby 와 같은 동적 언어 를 알 았 다 면 그 의 미 를 이미 알 고 있 었 을 것 이다.모 르 는 것 은 뒤의 코드 를 보 세 요.)
키워드 yield 를 사용 하 는 모든 함수(yield 가 코드 논리 에서 불가능 하 더 라 도)를'생 성기 함수'(generator function)라 고 부 르 며,생 성기 함 수 는 yield 를 통 해 값 을 되 돌려 줍 니 다.이 함수 들 은 return 을 통 해 함수 의 실행 을 중지 할 수 있 으 며,어떠한 반환 값 도 가지 고 있 지 않 지만,return 을 사용 하여 값 을 되 돌려 줄 수 없습니다.그러나 일반 함수 와 마찬가지 로 생 성기 함수 도 키워드 function 을 통 해 설명 하고 type:of 연산 자 도'function'으로 돌아 가 며 Function.prototype 에서 속성 과 방법 을 계승 할 수 있 습 니 다.요점 은:생 성기 함수 호출 은 생 성기 함수 의 함수 체 를 실행 하지 않 고 생 성기 대상 을 되 돌려 줍 니 다!생 성기 대상 은 다음 yield 문 구 를 만 날 때 까지 next()방법 을 포함 하고 있 습 니 다.이 때 생 성기 함수 의 yield 문장의 매개 변 수 는 next()방법의 반환 값 입 니 다.생 성기 함수 가 return 을 실행 하거나 함수 체 의 끝 에 도착 하면 next()는 StopIteration 을 던 집 니 다.
function r(min,max){
   for(let i = Math.ceil(min);i <= max;i++)
     yield i*i;
}

for(let n in r(1,10))
  console.log(n);

생 성 기 는 close()방법 을 포함 하고 호출 할 때 관련 생 성기 함수 가 실행 을 중지 합 니 다.마치 함수 가 실행 되 는 위치 에서 return 문 구 를 실행 하 는 것 과 같 습 니 다.현재 걸 려 있 는 위치 가 하나 이상 의 try 구문 블록 에 있다 면 먼저 finally 종 구 를 실행 하고 close()를 실행 하고 돌아 갑 니 다.close()는 반환 값 이 없 지만 finally 에 이상 이 생기 면 이 이상 은 close()에 전 파 됩 니 다.
생 성기 대상 은 send 방법 도 포함 되 어 있 습 니 다.매개 변 수 를 가 져 올 수 있 습 니 다.이 값 은 yield 표현 식 의 값 이 될 것 입 니 다.(yield 를 구문 이나 함수 로 보면 이 매개 변 수 는 구문 이나 함수 의 반환 값 입 니 다)next()와 send()를 제외 하고 throw()방법 이 있 습 니 다.이 방법 을 호출 하면 yield 표현 식 은 인 자 를 throw()에 이상 하 게 던 집 니 다.다음 코드 를 참조 하 십시오.
function cf(init){
    let next_v = init;
  while(true){
    try{
      let inc = yield next_v;
      if(inc)
        next_v += inc;
      else
        next_v++;
    }
    catch(e){
      if(e === "reset")
        next_v = init;
      else
        throw e;
    }
  }  
}

var c = cf(10);
console.log(c.toString());
console.log(c.next());
console.log(c.send(10));
console.log(c.throw("reset")); //next_v == 10;
console.log(c.next());

//     reset     
c.reset = function(){
  return this.throw("reset");
}

/*but Generator is not defined!!!
         !!!
Generator.prototype.reset = function(){
   return this.throw("reset");
}
*/

console.log(c.reset());

좋은 웹페이지 즐겨찾기