JS中的 generator
程序员文章站
2024-02-21 09:40:40
...
JS 中的 generator
(生成器)和 Python 中的很相似。
一个generator
看上去像一个函数,但可以返回多次。与函数不同的是,generator
由function*
定义(注意多出的*
号),并且,除了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
是否已经执行结束了。如果done
为true
,则value
就是return
的返回值。
当执行到done
为true
时,这个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的简单配置