Подтвердить что ты не робот

Что такое "функция *" в 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* быть. Что это?

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

4b9b3361

Ответ 1

Это предлагаемый синтаксис для 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

Ответ 2

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

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

Ответ 3

Тип function* выглядит как функция генератора для процессов, которые могут быть повторены. С# имеет такую ​​функцию, как "return return" см. 1 и см. 2

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