Что такое «функция *» в JavaScript? - PullRequest
230 голосов
/ 08 марта 2012

На этой странице я нашел новый тип функции 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, невозможно искать выражения со звездочками ( они используются в качестве заполнителей ).

Ответы [ 3 ]

186 голосов
/ 08 марта 2012

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

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

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


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

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

Дейв Герман из Mozilla выступил с докладом о EcmaScript.next . В 30: 15 он говорит о генераторах.

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

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

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

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

Обзор

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

Примеры

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

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
49 голосов
/ 08 марта 2012

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

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

11 голосов
/ 08 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...