MDN wants to learn about developers like you: https://qsurvey.mozilla.com/s3/MDN-dev-survey

현재 번역은 완벽하지 않습니다. 한국어로 문서 번역에 동참해주세요.

yield 키워드는 생성기 함수 (function* 또는 오래된 생성기 함수)를 중지하거나 재개하는데 사용됩니다.

문법

[rv] = yield [expression];
expression
생성기 함수에서 반복자 프로토콜을 통해 반환할 값을 정의합니다.  값이 생략되면  undefined를 반환합니다.
rv

생성기 실행을 계속 이어가기 위해서, 생성기의 next() 메서드에게 전달된 선택값을 반환합니다.

설명

yield는 생성기 함수 실행을 일시 중지하고, yield 키워드 뒤에오는 표현의 값을 생성기의 콜러(caller)에게 반환합니다. return 키워드의 생성기 버전이라 보면 됩니다.  

yield 키워드는 실제로 두 개의 속성을 가진 IteratorResult 객체를 반환합니다. value 속성은 yield 표현(expression)의 실행 결과를 보여주고, done 속성은 생성기 함수가 완전히 종료되었는지 여부를 불린(Boolean) 형태로 보여줍니다. 

yield 표현식에서 일시 중지되면 제너레이터의 다음()메서드가 호출될 때까지 제너레이터의 코드 실행이 일시 중지됩니다. 제너레이터의 다음()메서드를 호출할 때마다 제너레이터는 실행을 재개하고 다음 중 하나에 도달할 때까지 실행됩니다:

  •  A yield, 제너레이터가 다시 한번 멈추고 제너레이터의 새 값을 반환합니다. 다음번의 next()가 호출된 후, yield가 선언된 직후 바로 실행된다.
  • throw는 제네레이터에서 예외를 설정할 때 사용된다. 이러한 예외가 발생할 경우 일반적으로 발생하는 경우처럼 제너레이터의 전원을 완전히 껐다가 다시 켜는 것이 일반적으로 실행됩니다.
  • 제너레이터 기능의 끝에 도달합니다. 이 경우 제너레이터의 실행이 종료되고, 이 경우 값이 IteratorResult이고, 이 값이 undefined으로 반환됩니다.

  • return 문에 도달했습니다. 이 경우에는, 이 값이 종료되고 IteratorResult가 반환되는 값이 발신자에게 반환되며, 이 값이 반환 값에 의해 지정된 값입니다.

선택적인 값이 제너레이터의 다음()방식으로 변환되면 해당 값이 제너레이터의 현재 yield 작동으로 반환되는 값이 됩니다.

generator 코드 경로, yield연산자, Generator.prototype.next()에 이르기까지 새로운 시작 값을 지정할 수 있는 능력과 제네레이터는 엄청난 전력과 제어를 제공한다.

예시

다음 코드는 조력자 함수와 함께 예제 생성기 기능의 선언입니다.

function* foo(){
  var index = 0;
  while (index <= 2) // when index reaches 3, 
                     // yield's done will be true 
                     // and its value will be undefined;
    yield index++;
}

제너레이터 기능이 정의되면 그림과 같이 iterator를 구성하여 사용할 수 있습니다.

var iterator = foo();
console.log(iterator.next()); // { value: 0, done: false }
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

Specifications

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

Browser compatibility

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support 39 26.0 (26.0) ? ? ?
IteratorResult object instead of throwing ? 29.0 (29.0) ? ? ?
Feature Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Yes) 26.0 (26.0) ? ? ?
IteratorResult object instead of throwing ? 29.0 (29.0) ? ? ?

Firefox-specific notes

  • Starting with Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26), the completed generator function no longer throws a TypeError "generator has already finished". Instead, it returns an IteratorResult object like { value: undefined, done: true } (bug 958951).
  • Starting with Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30), the parsing of the yield expression has been updated to conform with the latest ES6 specification (bug 981599):
    • The expression after the yield keyword is optional and omitting it no longer throws a SyntaxError: function* foo() { yield; }

See also

문서 태그 및 공헌자

태그: 
 이 페이지의 공헌자: 2oosoo, Yunhong-Min, preco21
 최종 변경: 2oosoo,