tj. jak to wyrazić:
function *(next) {}
ze strzałkami. Wypróbowałem wszystkie kombinacje, jakie mogłem wymyślić, i nie mogę znaleźć na to żadnej dokumentacji.
(obecnie używa węzła v0.11.14)
javascript
ecmascript-6
generator
arrow-functions
Ashley Coolman
źródło
źródło
function*
Instrukcja (słowo kluczowe funkcji, po której następuje gwiazdka) definiuje funkcję generatora.”param*=>{ }
zrobić?function(){}
to nie robi tego samego co()=>{}
?Odpowiedzi:
Nie możesz Przepraszam.
Według MDN
Z dokumentu specyfikacji (moje podkreślenie):
źródło
.prototype
na przykład) i często jednowarstwowe, podczas gdy generatory są wręcz przeciwne.this
i musiałem napisaćlet self = this
hack, aby uzyskać dostęp do niego w generatorze. Przydałby się zakres leksykalny + składnia strzałki. Niestety, ale nie do końca świata.function
słowo kluczowe jako „złą część” języka. Są ku temu dobre powody. Dla tych osób brak generatorów strzał jest denerwującą niekonsekwencją.Różnica między funkcjami Inline i Arrow
Po pierwsze, funkcje strzałek
() => {}
nie są zastępowane funkcjami Inlinefunction(){}
i są różne. Funkcje Inline to po prostu Funkcje, więc pytanie brzmi, jaka jest różnica między funkcjami Strzałki a Funkcjami Inline.Kilka szybkich szczegółów tutaj
Dlaczego funkcja strzałki nie może być używana jako generator?
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions
Zauważ, że generatory bez
yield
nie mają sensu.Dlaczego funkcja strzałki nie może wykorzystywać wydajności
http://tc39wiki.calculist.org/es6/arrow-functions/
Wydajność w funkcji strzałki spowoduje wygenerowanie błędu semantycznego: http://www.ecma-international.org/
Ostatecznie przyczyną jest głęboka złożoność wdrażania ECMA6. C # nie pozwala na to również z nieco podobnych powodów .
źródło
()=>{}
bardzo pomogłoby, aby zrozumieć różnicę w stosunku do funkcji wbudowanej i dlaczego istnieją ograniczenia dla generatorów.*() => { yield bla; }
nie jest dobrze, aleasync () => { await bla; }
jest ...Oprócz dyskusji na stronie esdiscuss.org i notatkach ES6 komitetu Ecma TC39 z listopada 2013 r. Wspomnianych powyżej, strzałki generatora zostały ponownie sprawdzone podczas dwóch spotkań ES7 we wrześniu 2016 r. [1] [2] . Po dyskusji na temat zalet i wad różnych składni (głównie
=*>
i=>*
) oraz braku uzasadnień i przypadków użycia tej funkcji, doszli do wniosku, że:Propozycja strzał generatora została przeniesiona na Etap 1 z Brendan Eich i Domenic Denicola jako mistrzami.Wspomniana iteracja asynchroniczna została zakończona i wdrożona w 2018 r.
W październiku 2019 r. Pojawiło się oficjalne repozytorium Siergieja Rubanowa z dalszą dyskusją na temat składni i innych szczegółów.
źródło
Miałem też to samo pytanie i przyszedłem tutaj. Po przeczytaniu postów i komentarzy poczułem, że używanie generatora w funkcji strzałki wydaje się niejasne:
To może być główny powód, dla którego nie zaimplementowali generatora w związku z funkcją strzałki.
Ale gdybym był jednym z nich, pomyślałbym tak:
Wydaje się, że mamy funkcję asynchroniczną:
Ponieważ przy normalnej funkcji istnieje słowo kluczowe asynchroniczne , więc funkcja strzałki korzysta z niego -
async () =>
prawdopodobnie się wydajeasync function()
.Ale nie ma słowa kluczowego takiego jak
gen
lubgenerator
i, niestety, funkcja strzałki nie używa go.Podsumowując:
Nawet jeśli chcą zaimplementować generator w funkcji strzałki, myślę, że muszą przemyśleć składnię generatora w rdzeniu js:
A to będzie wielka pomyłka. Tak więc utrzymywanie funkcji strzałki poza generatorem jest całkiem fajne.
Po komentarzu @Bergi :
Powiem, że celem generatora jest Run-Stop-Run, więc nie sądzę, że musimy dbać o prototyp, leksykalne itp.
źródło
() ~> { yield 'a'; yield 'b'; }
. Szczerze mówiąc, po prostu uwielbiam tyldy.Wiem, że jest bardzo późno, ale innym możliwym powodem może być składnia. może
(*() => {})
działa, ale co z tym(9 ** () => {})
? Czy to 9 do potęgi funkcji strzałki, powracającejNaN
, czy też 9-krotność funkcji strzałki generatora, również powracającejNaN
? Można to zrobić za pomocą jakiejś alternatywnej składni, jak=>*
wspomniano w innej odpowiedzi tutaj, ale być może istnieje potrzeba zachowania spójności składni funkcji generatora (np.function* () {}
I{ *genMethod() {} }
) podczas jej implementacji. Nie za wymówka, ale powód.źródło
W tej chwili nie możesz, ale w przyszłości może tak być, ponieważ propozycja wydania TC39 na to samo w październiku 2019 r., Która jest na etapie 1.
źródło
Jest przyjemne obejście z saga redux
źródło