一个带状态的函数?可以这么理解
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, ...
}
网友评论