Вопрос

В этот странице я нашел новый тип функции JavaScript:

// NOTE: "function*" is not supported yet in Firefox.
// Remove the asterisk in order for this code to work in Firefox 13 

function* fibonacci() { // !!! this is the interesting line !!!
    let [prev, curr] = [0, 1];
    for (;;) {
        [prev, curr] = [curr, prev + curr];
        yield curr;
    }
}

я уже знаю что yield, let и [?,?]=[?,?] делать, но понятия не имею, что function* должно быть.Что это такое?

P.S.не пытайся пробовать Google, это невозможный для поиска выражений со звездочками (они используются в качестве заполнителей).

Это было полезно?

Решение

Это Генератор функция.

Генераторы — это функции, из которых можно выйти, а затем снова войти.Их контекст (привязки переменных) будет сохраняться при повторных входах.

Вызов функции-генератора не приводит к немедленному выполнению ее тела;Вместо этого возвращается объект итератора для функции.Когда итератор next() вызывается метод, тело функции-генератора выполняется до первого yield выражение, которое определяет значение, возвращаемое итератором, или, с помощью yield*, делегирует другую функцию генератора.


Историческая справка:

Это предлагаемый синтаксис для EcmaScript.next.

Дэйв Херман из Mozilla выступил с докладом о EcmaScript.next30:15 он говорит о генераторах.

Ранее он объяснил, как Mozilla экспериментально реализует предложенные изменения языка, чтобы помочь комитету управлять им.Дэйв тесно сотрудничает с Бренданом Эйхом, техническим директором Mozilla (я думаю) и первоначальным дизайнером JavaScript.

Более подробную информацию можно найти в вики рабочей группы EcmaScript: http://wiki.ecmascript.org/doku.php?id=harmony:generators

Рабочая группа (TC-39) пришла к общему мнению, что в EcmaScript.next должно быть какое-то предложение по генератору итераторов, но это не окончательное решение.

Не стоит рассчитывать на то, что это появится без изменений в следующей версии языка, и даже если оно не изменится, оно, вероятно, какое-то время не будет широко отображаться в других браузерах.

Обзор

Сопрограммы первого класса, представленные как объекты, инкапсулирующие контексты приостановленного выполнения (т. е. активации функций).Уровень техники:Python, Icon, Lua, Scheme, Smalltalk.

Примеры

«Бесконечная» последовательность чисел Фибоначчи (несмотря на поведение около 253):

function* fibonacci() {
    let [prev, curr] = [0, 1];
    for (;;) {
        [prev, curr] = [curr, prev + curr];
        yield curr;
    }
}

Генераторы можно перебирать в циклах:

for (n of fibonacci()) {
    // truncate the sequence at 1000
    if (n > 1000)
        break;
    print(n);
}

Генераторы — это итераторы:

let seq = fibonacci();
print(seq.next()); // 1
print(seq.next()); // 2
print(seq.next()); // 3
print(seq.next()); // 5
print(seq.next()); // 8

Другие советы

Это функция генератора - и так было сказано на странице, которую вы цитируете, в комментарии, который вы заменили на "вот это интересная строчка"...

По сути, это способ программно указать последовательности, чтобы их можно было передавать и получать доступ к элементам по индексу без необходимости предварительного вычисления всей последовательности (возможно, бесконечной по размеру).

А function* type выглядит так, как будто он действует как функция-генератор для процессов, которые можно повторять.В C# есть такая функция, использующая «возврат доходности». см. 1 и см. 2

По сути, это возвращает каждое значение одно за другим тому, что выполняет итерацию этой функции, поэтому их вариант использования показывает это в цикле стиля foreach.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top