Что такое «функция*» в JavaScript?
-
09-12-2019 - |
Вопрос
В этот странице я нашел новый тип функции 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.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*
type выглядит так, как будто он действует как функция-генератор для процессов, которые можно повторять.В C# есть такая функция, использующая «возврат доходности». см. 1 и см. 2
По сути, это возвращает каждое значение одно за другим тому, что выполняет итерацию этой функции, поэтому их вариант использования показывает это в цикле стиля foreach.