Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вопрос по DOM (https://javascript.ru/forum/misc/77356-vopros-po-dom.html)

Malleys 23.04.2019 12:19

Цитата:

Сообщение от рони
здесь вопросов нет, но как работет while(true) yield* недопонимаю.

Просто примеры, которые может помогут...

Тоже самое, что перебирать [1, 2, 3]
function* () {
    yield 1;
    yield 2;
    yield 3;
}


Тоже самое, что перебирать [1, 2, 3]
function* () {
    for(var i = 1; i < 3; i++)
        yield i;
}


Эти два примеры выше можно ведь легко переделать в бесконечный список...
Тоже самое, что перебирать cycle([1, 2, 3])
function* () {
    while(true) {
        yield 1;
        yield 2;
        yield 3;
    }
}


Тоже самое, что перебирать cycle([1, 2, 3])
function* () {
    while(true) {
        for(var i = 1; i < 3; i++)
            yield i;
    }
}


Этот последний пример можно переделать так...
Тоже самое, что перебирать cycle([1, 2, 3])
function* () {
    while(true) {
        yield* [1, 2, 3];
    }
}

рони 23.04.2019 14:53

Цитата:

Сообщение от Malleys
Этот последний пример можно переделать так...

спасибо, но с последним примером ступор, не понимаю почему 1, 2, 3, 1, 2, 3 ... а не 1, 2, 3, undefined, undefined, undefined ...?

Malleys 23.04.2019 17:09

Цитата:

Сообщение от рони
спасибо, но с последним примером ступор, не понимаю почему 1, 2, 3, 1, 2, 3 ... а не 1, 2, 3, undefined, undefined, undefined ...?

Давайте размотаем цикл!

У нас есть
function* () {
    while(true) {
        yield* [1, 2, 3];
    }
}


мы можем уменьшить цикл на одну итерацию...
function* () {
    yield* [1, 2, 3];

    while(true) {
        yield* [1, 2, 3];
    }
}


и ещё...
function* () {
    yield* [1, 2, 3];
    yield* [1, 2, 3];

    while(true) {
        yield* [1, 2, 3];
    }
}


и ещё...
function* () {
    yield* [1, 2, 3];
    yield* [1, 2, 3];
    yield* [1, 2, 3];

    while(true) {
        yield* [1, 2, 3];
    }
}


и ещё...
function* () {
    yield* [1, 2, 3];
    yield* [1, 2, 3];
    yield* [1, 2, 3];
    yield* [1, 2, 3];

    while(true) {
        yield* [1, 2, 3];
    }
}


поскольку это бесконечный цикл, то полностью его невозможно размотать.

UPD
Цитата:

Сообщение от рони
уже больше понимания, тут
yield* xs;
yield* cycle(xs);
здесь вопросов нет, но как работет while(true) yield* недопонимаю.
спасибо за обьяснения.

Обратите внимание на рекурсию в определении cycle
function* cycle(xs) {
    yield* xs;
    yield* cycle(xs);
}


можно попытаться раскрыть эту рекурсию...

function* cycle(xs) {
    yield* xs;
    yield* xs;
    yield* cycle(xs);
}


и ещё...
function* cycle(xs) {
    yield* xs;
    yield* xs;
    yield* xs;
    yield* cycle(xs);
}


естественно при полном раскрытии (бесконечное кол-во строчек с yield* xs;) вы никогда не достигнете последнего yield* cycle(xs);
то можно переписать так...
function* cycle(xs) {
    while(true)
        yield* xs;
}
Вы понимаете, что это одно и тоже определение, только без рекурсии?

UPD 2 внутри тела функции-генератора...
yield* xs;
означает тоже самое, что
for(const x of xs) yield x;

Цитата:

Сообщение от рони
но как работет
while(true) yield* xs;
недопонимаю.

т. е. это тоже самое, что
while(true) for(const x of xs) yield x;

рони 23.04.2019 17:51

Malleys,
ок, наверно на сейчас достаточно, приму как данность, пока для меня это магия и ниндзя стиль js, я могу это использовать, но нет понятия, почему это не вылетает с ошибкой работает. :thanks:


Часовой пояс GMT +3, время: 15:58.