generator(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次。
具体练习代码如下:
//generator(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次。
//实现一个斐波那契数列 ,函数只能返回一个数组
var f1 = max => {
var t, m = 0, n = 1, arr = [0, 1];
while (arr.length < max) {
t = m + n;
m = n;
n = t;
arr.push(t);
}
return arr;
};
console.log(f1(10));
//使用generator 可以一次返回一个数,不断返回多次,generator 定义是 function* f2(10) 并不是执行,只是创建了generator对象
// 执行需要使用next
var f2 = function* (max) {
var t, m = 0, n = 1, k = 1;
while (k < max) {
yield m;
t = m + n;
m = n;
n = t;
k++;
}
return m;
};
var r = f2(10);
console.log(r.next());//{ value: 0, done: false }
//返回的value就是yield的返回值,done表示这个generator是否已经执行结束了。如果done为true,则value就是return的返回值。
for (var x of r) {
console.log(x);
}
/**1
1
2
3
5
8
13
21 */
// 因为0已经在上面执行过了。
//generator 可以保存状态,还有一个用途就是异步回调代码变成“同步”代码
function a1(){
console.log("第一个任务");
}
function a2(){
console.log("第二个任务");
}
function a3(){
console.log("第三个任务");
}
var ff1=function(x){
console.log("任务结束");
}
ff1(a3(a2(a1())));
/**
* 第一个任务
第二个任务
第三个任务
任务结束
*/
//之前我们如果要顺序执行任务需要这样去一直回调,代码的可读性很差,
// 用generator是不是看起来很舒服
function* ff2(){
yield a1();
yield a2();
yield a3();
}
var s=ff2();
for(var x of s){};
执行结果如下: