Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 23.04.2019, 13:19
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от рони
здесь вопросов нет, но как работет 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];
    }
}
Ответить с цитированием
  #12 (permalink)  
Старый 23.04.2019, 15:53
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,059

Сообщение от Malleys
Этот последний пример можно переделать так...
спасибо, но с последним примером ступор, не понимаю почему 1, 2, 3, 1, 2, 3 ... а не 1, 2, 3, undefined, undefined, undefined ...?
Ответить с цитированием
  #13 (permalink)  
Старый 23.04.2019, 18:09
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от рони
спасибо, но с последним примером ступор, не понимаю почему 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;

Последний раз редактировалось Malleys, 23.04.2019 в 18:34.
Ответить с цитированием
  #14 (permalink)  
Старый 23.04.2019, 18:51
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,059

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
автоматическое удаление скоупа директивы при удаление dom узла FanAizu Angular.js 0 25.08.2015 22:38
Вопрос. Обращение к DOM элементам в фоне. sibirser Events/DOM/Window 2 20.07.2015 18:38
Есть вопрос от новичка в DOM и JavaScript ipman Events/DOM/Window 3 19.01.2011 10:05
Теоретический вопрос. gods33 (X)HTML/CSS 10 16.12.2010 23:49
Вопрос по объектам и DOM Hawk Events/DOM/Window 3 14.05.2008 15:04