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?

Author: alexpods, 2015-01-05

2 answers

Trzy powody były następujące:

  1. 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).

  2. 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.

  3. 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.)

 66
Author: Andreas Rossberg,
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.

 7
Author: Alex K.,
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