js笔记06-generator 生成器

一个带状态的函数?可以这么理解

function* foo(x) {
    yield x + 1;
    yield x + 2;
    return x + 3;
}

注意*和里面的yield
如果是python,那就不需要*,只要有yield关键字的,就是生成器

调用generator对象有两个方法,一是不断地调用generator对象的next()方法:

function* fib(max) {
    var
        t,
        a = 0,
        b = 1,
        n = 0;
    while (n < max) {
        yield a;
        [a, b] = [b, a + b];
        n ++;
    }
    return;
}

fib(5); // fib {[[GeneratorStatus]]: "suspended", [[GeneratorReceiver]]: Window} 直接调用

用next()方法
var f = fib(5);
f.next(); // {value: 0, done: false}
f.next(); // {value: 1, done: false}
f.next(); // {value: 1, done: false}
f.next(); // {value: 2, done: false}
f.next(); // {value: 3, done: false}
f.next(); // {value: undefined, done: true}

第二个方法是直接用for ... of循环迭代generator对象,这种方式不需要我们自己判断done

'use strict'

function* fib(max) {
    var
        t,
        a = 0,
        b = 1,
        n = 0;
    while (n < max) {
        yield a;
        [a, b] = [b, a + b];
        n ++;
    }
    return;
}

for (var x of fib(10)) {
    console.log(x); // 依次输出0, 1, 1, 2, 3, ...
}

你可能感兴趣的:(js笔记06-generator 生成器)