[javascript] JavaScript에서 “함수 *”란 무엇입니까?

에서 페이지 나는 새로운 자바 스크립트 기능 유형을 발견 :

// NOTE: "function*" is not supported yet in Firefox.
// Remove the asterisk in order for this code to work in Firefox 13 

function* fibonacci() { // !!! this is the interesting line !!!
    let [prev, curr] = [0, 1];
    for (;;) {
        [prev, curr] = [curr, prev + curr];
        yield curr;
    }
}

나는 이미 알고 무엇을 yield, let그리고 [?,?]=[?,?]할 수 있지만,이 무슨 생각이없는 function*것으로 의미합니다. 무엇입니까?

PS는 그것의, 구글을하려고 귀찮게하지 않습니다 불가능 (별표 표현을 검색하기 위해 그들이 자리로 사용하고 있습니다 ).



답변

그것은이다 발전기 기능.

생성기는 종료하고 나중에 다시 입력 할 수있는 기능입니다. 그들의 문맥 (가변 바인딩)은 재 입장에 걸쳐 저장 될 것입니다.

생성기 함수를 호출해도 본문이 즉시 실행되지는 않습니다. 대신 함수의 반복자 객체가 반환됩니다. 이터레이터의 next()메소드가 호출되면 첫 번째 yield표현식 까지 생성기 함수의 본문이 실행 됩니다.이 표현식은 반복자에서 리턴 될 값을 지정하거나 yield*또는를 사용하여 다른 생성기 함수에 위임합니다.


역사적 메모 :

의 제안 된 구문입니다 EcmaScript.next.

Mozilla의 Dave Herman은 EcmaScript.next 에 대해 이야기했습니다 . 시 30:15 그는 발전기에 대해 이야기합니다.

앞서 그는 모질라가 어떻게위원회를 운영 할 수 있도록 제안 된 언어 변경을 실험적으로 구현하고 있는지 설명했다. Dave는 Mozilla의 CTO 인 Brendan Eich (원본이라고 생각합니다) 및 원래 JavaScript 디자이너와 긴밀히 협력합니다.

EcmaScript 워킹 그룹 위키에 대한 자세한 내용은 http://wiki.ecmascript.org/doku.php?id=harmony:generators를 참조하십시오.

워킹 그룹 (TC-39)은 EcmaScript.next에 일종의 제너레이터 이터레이터 제안이 있어야한다는 일반적인 합의를 가지고 있지만 이것이 최종적인 것은 아닙니다.

다음 버전의 언어를 변경하지 않고이 표시에 의존해서는 안되며, 변경되지 않더라도 다른 브라우저에서는 한동안 널리 표시되지 않을 것입니다.

개요

일시 중단 된 실행 컨텍스트를 캡슐화하는 객체 (즉, 기능 활성화)로 표현되는 일류 코 루틴. 선행 기술 : Python, Icon, Lua, Scheme, Smalltalk.

피보나치 수의 “무한”순서 (약 2 53 )

function* fibonacci() {
    let [prev, curr] = [0, 1];
    for (;;) {
        [prev, curr] = [curr, prev + curr];
        yield curr;
    }
}

루프에서 생성기를 반복 할 수 있습니다.

for (n of fibonacci()) {
    // truncate the sequence at 1000
    if (n > 1000)
        break;
    print(n);
}

생성기는 반복자입니다.

let seq = fibonacci();
print(seq.next()); // 1
print(seq.next()); // 2
print(seq.next()); // 3
print(seq.next()); // 5
print(seq.next()); // 8

답변

함수생성기 함수입니다. 인용 한 페이지에서 “이것은 흥미로운 라인입니다”라는 주석에서 …

기본적으로 시퀀스를 프로그래밍 방식으로 지정하여 전체 시퀀스 (무한한 크기의 크기)를 미리 계산하지 않고도 인덱스로 액세스하고 요소에 액세스 할 수 있습니다.


답변

function*형 보이는 것이 반복 될 수있는 프로세스를위한 발전기 역할 기능 등을들 수있다. C #에는 “수익률 반환”을 사용하는 이와 같은 기능이 있습니다. 1 참조2 참조

본질적으로 이것은이 함수를 반복하는 모든 것에 하나씩 각 값을 하나씩 반환하므로 유스 케이스가 foreach 스타일 루프로 표시됩니다.


답변