This is a new technology, part of the ECMAScript 2015 (ES6) standard.
This technology's specification has been finalized, but check the compatibility table for usage and implementation status in various browsers.

function* 선언 (끝에 별표가 있는 function keyword) 은 generator function 을 정의하는데, 이 함수는 Generator 객체를 반환합니다.

generator function 은 GeneratorFunction 생성자와 function* expression 을 사용해서 정의할 수 있습니다.

문법

function* name([param[, param[, ... param]]]) {
   statements
}
name
함수명.
param
함수에 전달되는 인수의 이름. 함수는 인수를 255개까지 가질 수 있다.
statements
함수의 본체를 구성하는 구문들.

설명

Generator 는 빠져나갔다가 나중에 다시 돌아올 수 있는 함수입니다. 이때 컨텍스트(변수 값)는 나가고 다시 들어오는 중에도 그대로 저장되어 있게 됩니다.

Generator function 은 호출하더라도 함수가 즉시 실행되지 않습니다. 대신 함수를 위한 iterator object 가 리턴됩니다. iterator의 next() 메서드가 호출되면, generator 함수가 실행되고 첫 번째 yield expression 을 만날 때까지 진행됩니다. 그리고 해당 yield expression 이 가리키는 값이 iterator 로부터 리턴됩니다. 만약 실행 도중 yield* expression 을 만나면 다른 generator 함수로 진행이 넘어가게 됩니다. 이후 next() 메서드가 호출되면 진행이 멈췄던 부분에서부터 다시 실행됩니다. next() 메서드는 객체를 리턴하는데, 이 객체에는 yield expression 이 가리키던 값(yielded value)을 나타내는 value 속성과, generator 함수 안의 모든 yield expression이 실행되었는지를 나타내는 boolean 타입의 done 속성이 포함됩니다.next() 메서드를 인자 값과 함께 호출 하게 되면  진행이 멈췄던 부분의 yield 문을  next() 메서드에서 받은 인자값 으로 치환 하고 그 부분 부터 다시 실행 하게 됩니다.

예시

간단한 예제

function* idMaker(){
  var index = 0;
  while(index < 3)
    yield index++;
}

var gen = idMaker();

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // undefined
// ...

yield* 를 사용한 예제

function* anotherGenerator(i) {
  yield i + 1;
  yield i + 2;
  yield i + 3;
}

function* generator(i){
  yield i;
  yield* anotherGenerator(i);
  yield i + 10;
}

var gen = generator(10);

console.log(gen.next().value); // 10
console.log(gen.next().value); // 11
console.log(gen.next().value); // 12
console.log(gen.next().value); // 13
console.log(gen.next().value); // 20

Generator 에 인자값을 넘기는 예제

function* logGenerator() {
  console.log(yield);
  console.log(yield);
  console.log(yield);
}

var gen = logGenerator();

// the first call of next executes from the start of the function
// until the first yield statement
gen.next(); 
gen.next('pretzel'); // pretzel
gen.next('california'); // california
gen.next('mayonnaise'); // mayonnaise

Generator 는 생성자로서 사용될 수 없다

function* f() {}
var obj = new f; // throws "TypeError: f is not a constructor"

 

Specifications

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'function*' in that specification.
Standard Initial definition.

Browser compatibility

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support 39.0 26.0 (26.0) No support 26 No support
yield* (Yes) 27.0 (27.0) No support 26 No support
IteratorResult object instead of throwing (Yes) 29.0 (29.0) No support (Yes) No support
Feature Android Android Webview Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
Basic support No support (Yes) 26.0 (26.0) No support No support No support 39.0
yield* No support (Yes) 27.0 (27.0) No support No support No support (Yes)
IteratorResult object instead of throwing No support ? 29.0 (29.0) No support No support No support (Yes)

 

Firefox에 한정된 내용

Firefox 26버전 이전에서의 Generator 와 iterator

구버전 Firefox는 오래된 버전의 사양으로 generator 를 구현하고 있습니다. 구버전에서는 generator가 별표없는 function keyword로 정의되는데, 이와 관련해서는 Legacy generator function 에 자세하게 설명되어 있습니다.

IteratorResult object returned instead of throwing

Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) 부터는 완료된 generator function 에서 TypeError "generator has already finished" 라는 오류 대신에 { value: undefined, done: true } 와 같은 IteratorResult object 를 반환합니다.(bug 958951).

관련 항목

문서 태그 및 공헌자

 이 페이지의 공헌자: resoliwan, KisukPark, AHNJAEHA, preco21, JaehaAhn
 최종 변경: resoliwan,