생성기와 함께 ES6의 화살표 함수 구문을 사용할 수 있습니까? (화살표 표기법)


243

즉, 이것을 어떻게 표현합니까?

function *(next) {}

화살표로. 내가 생각할 수있는 모든 조합을 시도했지만 그에 대한 문서를 찾을 수 없습니다.

(현재 노드 v0.11.14 사용)


5
당신은 할 수 없습니다. 죄송합니다. "이 function*문장 (함수 키워드 뒤에 별표)은 생성기 함수를 정의합니다."

2
esdiscuss.org 에서이 주제 대해 다소 긴 토론이 있었습니다 .
voithos

4
무엇을 기대 param*=>{ }하십니까?
CoderPi

4
당신은 그것 function(){}과 똑같지 않다는 것을 알고 ()=>{}있습니까?
CoderPi

8
" ES6 발전기 앞으로 2 단계 1 단계 다시이라는 것을 정말입니까? "- 아니, 발전기는 앞으로 단계 수 있습니다 :-)
BERGI

답변:


231

생성기와 함께 ES6의 화살표 함수 구문을 사용할 수 있습니까?

당신은 할 수 없습니다. 죄송합니다.

MDN 에 따르면

function*(문 function키워드 다음에 별표)는 발전기 기능을 정의합니다.

A로부터 사양 문서 (내 강조) :

함수 구문은 옵션으로 추가 확장 *토큰을 :

FunctionDeclaration: "function" "*"? Identifier "(" FormalParameterList? ")" 
  "{" FunctionBody "}"

175
나에게 디자인 결함 같은 느낌.
Jonathon

23
@ Jonathon : 아니오. Arrow 기능은 가볍고 ( .prototype예를 들어 있지 않음 ) 종종 라이너 가 있어야 하며 발전기는 그 반대입니다.
Bergi

38
나는 이미 재생하고있는 발전기가 이전에 액세스 해야하는 몇 가지 시나리오를 이미 실행 했으며 발전기 내부에 액세스하기 위해 핵을 this작성 let self = this해야했습니다. 어휘 범위 + 화살표 구문이 좋을 것입니다. 불행히도 세상의 끝은 아닙니다.
dvlsg

3
에서이 주변에 일부 추가 컨텍스트 esdiscuss
닉 톰린

20
@Bergi 화살표 기능의 추론은 그보다 훨씬 복잡합니다. 간결함에 관한 것이 아닙니다. 화살표 함수는 가벼울 필요는 없습니다. 선택적 단일 문 본문 구문이있는 것이 사실입니다. 많은 사람들이 클래스 메소드를 제외한 모든 함수 정의에 화살표를 사용하고 function키워드를 언어의 '나쁜 부분'으로 강등시킵니다 . 이를 수행 할만한 이유가 있습니다. 이 사람들에게 화살표 생성기 부족은 성가신 불일치입니다.
callum

131

인라인 함수와 화살표 함수의 차이점

우선 화살표 기능 () => {} 은 인라인 기능을 대체하도록 만들어지지 않았으며 function(){}서로 다릅니다. 인라인 함수는 단순히 함수이므로 화살표 함수와 인라인 함수의 차이점은 무엇입니까?

화살표 함수식 (또한 화살표 함수로서 알려진)이 함수식에 비해 짧은 구문과 결합하지 않는 자체 this, arguments, super, 또는 new.target). 화살표 기능은 항상 익명입니다.

좀 더 자세한 내용은 여기


화살표 기능을 발전기로 사용할 수없는 이유

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions

수익률 키워드 사용

수율 키워드 (상기 내에 중첩 된 함수 내에서 허용하는 경우를 제외)을 화살표 함수의 신체에 이용 될 수 없다. 결과적으로 화살표 기능을 생성기로 사용할 수 없습니다.

참고 발전기 하지 않고는 yield이해가되지 않습니다.


화살표 함수가 수확량을 사용할 수없는 이유

http://tc39wiki.calculist.org/es6/arrow-functions/

기능을 화살표 바인드 this어휘, 바인드 return에서 블록 본체 케이스는 직접 둘러싸는 화살표 기능, 배제로부터 반환 있도록 break하고 continue직접 둘러싸는 화살표 함수 외부 문을 참조에서.

식별자 기본 식은 arguments화살표 함수의 본문 (식 또는 블록 형태의 여부)를 사용할 수 없다.

마찬가지로 yield화살표 기능의 바디에는 사용할 수 없습니다. 화살표는 생성자가 될 수 없으며 계속되는 것을 원하지 않습니다.

Arrow-Function의 수율은 시맨틱 오류를 발생시킵니다 : http://www.ecma-international.org/

결국 그 이유는 ECMA6의 구현이 매우 복잡하기 때문입니다. C #에서는 이와 비슷한 이유로 이를 허용하지 않습니다 .


3
나는 검색 엔진을 사용하고 당신을 위해 한 번 더 설명을 게시
CoderPi

1
나는 여전히 설명을 추가하면 ()=>{}인라인 함수와의 차이점을 이해하는 데 많은 도움이 될 것이라고 생각합니다 . 제너레이터에 한계가있는 이유.
vitaly-t

63
나는 왜 안 좋은지 알아 내려고 노력하고 *() => { yield bla; }있지만 async () => { await bla; }...
리 벤슨

7
@CodeiSir, Re " 우리는 깊은 연속을 원하지 않습니다 .", 변명.
Pacerier

9
당신의 주장은 주기적입니다. 화살표 함수에는 yield 키워드가 없기 때문에 생성기가 될 수 없다고 말합니다. 그러나 그들은 생성자가 될 수 없기 때문에 yield 키워드를 가질 수 없습니다. "화살표는 생성자가 될 수 없으며 우리는 깊은 연속성을 원하지 않습니다."
Thayne

35

esdiscuss.org 및 위에서 언급 한 2013 년 11 월의 Ecma TC39위원회 ES6 회의 노트 에 대한 토론 외에도 2016 년 9 월 2 회의 ES7 회의에서 생성기 화살표가 다시 표시되었습니다 [1] [2] . 다양한 구문 (주로 =*>=>*)의 장단점에 대한 토론 과이 기능에 대한 타당성 및 사용 사례가 부족하면 다음과 같은 결론을 얻었습니다.

  • 위원회의 관심이 있지만 새로운 구문을 추가하기 위해 기능이 가중치를 부여하지 않는다는 우려
  • =>*[Domenic Denicola]의 비동기 반복 제안의 일부로 적어도 0 단계에 도달 할 수 있는지 3 일차에 다시 방문 할 계획입니다.

생성기 화살에 대한 제안은 챔피언 인 Brendan Eich와 Domenic Denicola와 함께 1 단계 로 옮겨졌습니다 . 위에서 언급 한 비동기 반복 은 2018 년 에 완료되어 구현 되었습니다.

2019 년 10 월 Sergey Rubanov의 공식 리포지토리 가 구문 및 기타 세부 사항에 대한 자세한 설명과 함께 나타납니다.


8

나는 또한 같은 질문을하고 여기에왔다. 게시물과 댓글을 읽은 후 화살표 기능으로 생성기를 사용하는 것이 모호한 것 같습니다.

const generator = () => 2*3; // * implies multiplication
// so, this would be a confusing
const generator = () =>* something; // err, multiplying?
const generator = () =*> ... // err, ^^
const generator = ()*=> ... // err, *=3, still multiplying?
const generator=*()=> ... // err, ^^
const generator = *param => ... //err, "param" is not fixed word

이것이 화살표 기능과 관련하여 생성기를 구현하지 않은 큰 이유 일 수 있습니다.


그러나 내가 그들 중 하나라면 다음과 같이 생각할 수 있습니다.

const generator = gen param => ... // hmm, gen indicates a generator
const generator = gen () => ... // ^^

이것은 비동기 함수가있는 것처럼 느껴집니다.

const asyncFunction = async () => ... // pretty cool

정상적인 기능을 사용하면 async 키워드가 존재하므로 화살표 기능이 그것을 사용하는 async () =>것 같습니다 async function().

그러나 gen또는 같은 키워드 generator가 없으며 아아 화살표 기능이 사용하지 않습니다.

결론적으로:

화살표 기능으로 생성기를 구현하려는 경우에도 핵심 js에서 생성기 구문에 대해 다시 생각해야한다고 생각합니다.

generator function myfunc() {}
// rather than
function* myfunc() {} // or, function *myfunc() {}

그리고 이것은 큰 실수입니다. 따라서 발전기에서 화살표 기능을 사용하지 않는 것이 좋습니다.


다음 @Bergi 코멘트를 :

화살표 기능은 가볍고 (예를 들어. 프로토 타입이없는) 종종 1 개의 라이너로되어 있지만 발전기는 그 반대입니다.

사용하는 생성기 목적은 run-stop-run 이라고 말하며 프로토 타입, 어휘 등을 신경 쓸 필요가 없다고 생각합니다.


2
같은 이국적인 옵션도 고려할 수 있습니다 () ~> { yield 'a'; yield 'b'; }. 솔직히 말해서 나는 물결표를 좋아합니다.
Gershom

@Gershom 이것은 Perl 과 같은 프로그래밍 언어 가 완전히 잘못되는 방식입니다
Sapphire_Brick

2

나는 이것이 매우 늦다는 것을 알고 있지만 가능한 또 다른 이유는 구문 일 수 있습니다. 아마도(*() => {}) 작동하지만 어떻 (9 ** () => {})습니까? 9를 화살표 함수의 거듭 제곱으로 NaN반환 NaN합니까 , 아니면 9 배의 생성기 화살표 함수로 반환 합니까? =>*여기에 다른 답변에서 언급했듯이 대체 구문으로 수행 할 수 있지만 생성기 함수 구문 (예 : function* () {}{ *genMethod() {} }) 의 일관성을 유지하려는 욕구가 있을 수 있습니다. 변명이 아니라 그 이유가 있습니다.


1
: +1 : 이중 별표의 경우 ... 구식 JS 사람입니다. 누가 당신이 오래된 개에게 새로운 트릭을 가르 칠 수 없다고 말합니다 : joy :
Shanimal

그들이하지 않는 유일한 이유는 파서를 만드는 것이 어렵 기 때문입니다. 그것은 전적으로 가능하며 구문에서 타협 할 필요가 없습니다.
Jason McCarrell

@JasonMcCarrell 만약 파서를 너무 복잡하게 만들지 않았다면 Brendan Eich가 Scheme을 브라우저에 넣었을 것이다.
Sapphire_Brick

1

현재로서는 할 수 없지만 앞으로는 1 단계에있는 2019 년 10 월에 TC39 출시 제안 이 있기 때문일 수 있습니다 .


-4

redux-saga와 함께 좋은 해결 방법이 있습니다

import { call, all } from 'redux-saga/effects';

function* gen() {
   yield all([].map(() => {
      return call(....);
   }));
}

4
OP가 Redux를 사용하고 있는지 어떻게 알 수 있습니까?
Maros
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.