2016-07-28 3 views
0

에 돌아 가지 않는 이유는 무엇입니까 yield 키워드 뒤에 오는 호출 반환 next()에 가치인가? 제 next()에서왜 두 번째 수율이 발전기 아래의 코드에서

function* generatorFunction() { 
    yield (yield 'the second yield')(); 
} 

function func(x) { 
    return 'func passed to the second next()'; 
} 

var iterator = generatorFunction(); 

var firstValue = iterator.next().value; 
var secondValue = iterator.next(func).value; 

console.log(firstValue); // "the second yield" 
console.log(secondValue); // "func passed to the second next()" 

그것은 바로 표현으로 제 yield 후의 라인의 나머지를 처리? 즉, (yield x)()은 x로 평가되지만 실제로 평가하는 동안 수율에 멈추지 않습니다.

두 번째 호출에서 next 함수를 전달하면 해당 함수는 (yield 'the second yield') 대신 실행되어 실행되고 그 값을 반환합니다.

아무도 여기에 무슨 일이 일어나는지 설명 할 수 있습니까?

실제적인 용도가 아니기 때문에 나는 es6katas을 살펴볼 것입니다.

+0

@estus와 동의 : 그냥 첫 번째 수익률을 반환하면 첫 번째 수익률을 반환하겠습니까? –

+0

나는 문자 그대로 '첫 번째 수익률에서 멈춤'을 취하고 있었다고 생각한다. (나는 실제로 돌아올 것이 무엇인지에 대해 당혹 스러웠다.) 그래서 그것은 '반환'과 마찬가지로 수율 표현식이 평가되는 순서대로 산출된다. 완벽한 의미로, 고마워. @estus는 그 대답을 자유롭게 복사 할 수 있습니다. –

+0

물론입니다. 저는 '언어 감각'에 호소하는 대신 연산자 우선 순위 설명으로이를 보완했습니다. – estus

답변

1

이것은 좋은 예이지만 거의 설명이 없습니다.

발현

yield (yield 'the second yield')(); 
operator precedence

에있어서, 안팎 ​​평가된다.

우선, 외부 yield의 오른쪽 부분은 (yield 'the second yield')()으로 평가됩니다.

왼쪽 기능 부분, (yield 'the second yield') 그룹이 먼저 평가됩니다. 'the second yield' 값이 처음 next() 호출에서 반환되면 생성기가 내부 yield에서 일시 중지됩니다.

발전기 next(func) 통화를 재개 yield 'the second yield' 보낸 값 (func)로 평가하고 오른쪽 기능 부 func()'func passed to the second next()'로 평가된다.

마지막으로 외부 의 왼쪽 부분이 계산되고 이 두 번째 next(func) 호출에서 반환되고 생성기가 일시 중지되었습니다.

관련 문제