Jaki jest cel gwiazdki ( * ) w funkcjach generatora ES6
Może mi ktoś wyjaśnić: dlaczego funkcje generatora w ES6 są oznaczone symbolem asterisk?
Na przykład zamiast:
function *someGenerator() {
yield 1;
yield 2;
yield 3;
}
Moglibyśmy napisać:
function someGenerator() {
yield 1;
yield 2;
yield 3;
}
Lub nawet:
var someGenerator = () => {
yield 1;
yield 2;
yield 3;
}
var someObject = {
someGenerator() {
yield 1;
yield 2;
yield 3;
}
}
Kompilator JS może wykryć, że someGenerator
zawiera operator yield
w czasie parsowania i stworzyć generator z tej funkcji.
Dlaczego wykrycie yield
istnienia nie wystarczy?
2 answers
Trzy powody były następujące:
czytelność . Generator jest zupełnie inny od funkcji, a różnica powinna być natychmiast widoczna (to znaczy bez badania całej implementacji w poszukiwaniu wydajności).
ogólność . Powinno być oczywiście możliwe pisanie generatorów, które nie dają, a tylko zwracają bezpośrednio. Co więcej, komentowanie części ciała (np. do debugowania) nie powinno bezgłośnie zmieniać, czy coś jest generatorem.
-
zgodność . Tylko strict mode zarezerwował "yield" jako słowo kluczowe, ale postawiono sobie za cel dla ES6, że wszystkie nowe funkcje są również dostępne w trybie niechlujnym (niefortunna decyzja IMHO, ale mimo to). Co więcej, nawet w trybie ścisłym istnieje wiele subtelności parsowania wokół 'yield'; na przykład, rozważmy argumenty domyślne:
function* g(a = yield(2)) { 'use strict' }
Bez
*
, parser może zdecydować, jak przeanalizować wydajność dopiero po tym, jak zobaczy ciało funkcja. Oznacza to, że potrzebujesz nieskończonego spojrzenia w przyszłość, śledzenia wstecz lub innych hakerskich technik, aby sobie z tym poradzić.
Powinienem zauważyć, że (1) i (2) są już wystarczającym powodem.
(pełne ujawnienie: jestem członkiem Komitetu EcmaScript.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-05 20:46:37
Puste Generatory (bez ciała) nie są niedozwolone; więc czy unStarredFunc()
należy podążać za semantyką generatora czy nie?
Ze względu na kompatybilność:
function yield(x) { return x };
function a() {
yield (4+1);
};
Jest to poprawne składniowo, ale wywołanie .next()
spowodowałoby błąd, podczas gdy dodanie gwiazdki do jawnego zdefiniowania generatora spowodowałoby .next().value === 5
Wykryj, że someGenerator zawiera operator wydajności w czasie parsowania
Niektóre konstrukcje nie mogą być rozwiązane w czasie parsowania:
function someGenerator(i) {
if (glob)
return 4;
else
yield* anotherGen(i);
}
I z oczywiście jest to prostsze do zobaczenia od razu z definicji function*
, że jest generatorem bez konieczności kopania w jego źródło, aby szukać plonów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-05 12:28:17