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

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

function *(next) {}

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

(현재 노드 v0.11.14 사용)



답변

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

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

MDN 에 따르면

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

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

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

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


답변

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

우선 화살표 기능 () => {} 은 인라인 기능을 대체하도록 만들어지지 않았으며 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 #에서는 이와 비슷한 이유로 이를 허용하지 않습니다 .


답변

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의 공식 리포지토리 가 구문 및 기타 세부 사항에 대한 자세한 설명과 함께 나타납니다.


답변

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

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 이라고 말하며 프로토 타입, 어휘 등을 신경 쓸 필요가 없다고 생각합니다.


답변

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


답변

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


답변

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

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

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