欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS中的 generator

程序员文章站 2024-02-21 09:40:40
...

  JS 中的 generator (生成器)和 Python 中的很相似。

  一个generator看上去像一个函数,但可以返回多次。与函数不同的是,generatorfunction*定义(注意多出的*号),并且,除了return语句,还可以用yield返回多次。

比如用 generator 写一个生成斐波那契数列的函数:

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

var f = fib(5);	//这里调用了fib函数,但只是创建了一个generator对象,而不是调用它

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

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}

  next()方法会执行generator的代码,然后,每次遇到yield x就返回一个对象{value: x, done: true/false},然后“暂停”。

  每次调用 next 方法时,程序会回到上次 yield 返回的地方,然后继续执行代码,且代码中的上下文环境会被保存下来,如 a,b,n 这几个变量就是上次代码执行的结果。

  返回的value就是yield的返回值,done表示这个generator是否已经执行结束了。如果donetrue,则value就是return的返回值。

  当执行到donetrue时,这个generator对象就已经全部执行完毕,不要再继续调用next()了。

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

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

来源:https://www.liaoxuefeng.com/wiki/1022910821149312/1023024381818112

上一篇: vim的简单配置

下一篇: