generator由function*定义
generator(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次。
与函数的不同之处
generator和函数不同的是,generator由function*
定义(注意多出的*号),并且,除了return
语句,还可以用yield
返回多次。
next()
方法会执行generator的代码,然后,每次遇到yield x;
就返回一个对象{value: x, done: true/false}
,然后“暂停”。返回的value
就是yield
的返回值,done
表示这个generator是否已经执行结束了。如果done
为true
,则value
就是return
的返回值。
当执行到done
为true
时,这个generator对象就已经全部执行完毕,不要再继续调用next()
了。
例子
const log = console.log;
function fib(max) {
let a = 0;
let b = 1;
let arr = [a, b];
while (arr.length < max) {
let c = b;
b = a + b;
a = c;
arr.push(b);
}
log("arr = ", arr);
}
//生成器function*
function* gf(max) {
let a = 0;
let b = 1;
let n = 0;
while (n < max) {
yield a;
let c = b;
b = a + b;
a = c;
n++;
}
return 89899;
}
fib(5);
let g = gf(5);
let n = 0;
while (n < 7) {
let r = g.next();
// if (r.done) {
// break;
// }
log("n = ", n, ", ", r);
n++;
}
for (let v of gf(5)) {
log("v = ", v);
}
结果:
arr = [ 0, 1, 1, 2, 3 ]
n = 0 , { value: 0, done: false }
n = 1 , { value: 1, done: false }
n = 2 , { value: 1, done: false }
n = 3 , { value: 2, done: false }
n = 4 , { value: 3, done: false }
n = 5 , { value: 89899, done: true }
n = 6 , { value: undefined, done: true }
v = 0
v = 1
v = 1
v = 2
v = 3
参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/function*
<