JavaScript에서 "함수 *"란 무엇입니까?


243

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

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


4
예제의 주석은 이제 아주 오래되었습니다 . function*v26부터 Firefox에서 구문이 지원됩니다 : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… *. 이전 버전은 다른 구문을 사용했습니다.
Nickolay

39
Google의 경우 "기능 별"또는 "기능 별표"를 검색하십시오. 그것이 내가이 질문을 찾은 방법입니다.).
trysis

2
등 외모 *@Nickolay에서 링크에서 제거되었다. MDN에 직접function* 연결되는 링크는 다음과 같습니다 . v26 이후 "기본"지원으로 충분 합니다.
ruffin

또 다른 MDN 링크 (그런데, 내가 OP에 의해 링크 된 MDN 페이지에있는) : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
BlueRaja - 대니 Pflughoeft

답변:


199

그것은이다 발전기 기능.

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

생성기 함수를 호출해도 본문이 즉시 실행되지는 않습니다. 대신 함수의 반복자 객체가 반환됩니다. 이터레이터의 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

7
후속 조치 : 매개 변수 ( for(;;))가 없는 for 루프 는 무엇을합니까? 이 맥락에서 왜 사용합니까?
퍼기

13
@Fergie는와 for(;;)동일합니다 while (true). 피보나치 수열은 무한한 수열이기 때문에이 맥락에서 사용됩니다.
Mike Samuel

5
선행 기술 : C # 수율?
Dave Van den Eynde

3
@DaveVandenEynde, 선행 기술 : Python yield. 선행 선행 기술 : CLU 및 아이콘.
Mike Samuel

52

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

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


10
"전체 시퀀스를 계산하지 않고 인덱스로 액세스"는 지금까지 내가 본 발전기에 대한 가장 유용한 설명 일 것입니다. 이전에는 이론적으로 이해하는 것보다 앱에서 이것을 사용하는 것을 볼 수있었습니다.
wes

11

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.