Что такое "функция *" в JavaScript?
На этой странице я нашел новый тип функции 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*
должен быть. Что это?
PS не пытайтесь использовать Google, невозможно найти выражения со звездочками ( они используются в качестве заполнителей).
4 ответа
Это функция генератора.
Генераторы - это функции, которые можно завершить, а затем снова ввести. Их контекст (привязки переменных) будет сохранен при повторном входе.
Вызов функции генератора не выполняет ее тело немедленно; вместо этого возвращается объект-итератор для функции. Когда итератор
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.
Примеры
"Бесконечная" последовательность чисел Фибоначчи (несмотря на поведение около 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*
Тип выглядит так, как будто он действует как генераторная функция для процессов, которые можно повторять.
C# имеет такую функцию, используя "return return", см. 1 и см. 2
По сути, это возвращает каждое значение одно за другим к любой итерации этой функции, поэтому их сценарий использования показывает это в цикле стиля foreach.