美文网首页
js笔记06-generator 生成器

js笔记06-generator 生成器

作者: 大飞哥 | 来源:发表于2018-01-06 23:23 被阅读10次

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

    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 生成器

          本文链接:https://www.haomeiwen.com/subject/fevunxtx.html