生成器 Generator

ES6生成器(Generator)


在这里插入图片描述

什么是生成器(Generator)?

生成器就是通过构造函数Generator创建出来的对象,生成器既是一个迭代器,同时又是一个可迭代的对象

基本操作

语法:

function* myGenerator() {
  yield 'hello';
  yield 'world';
  return 'Generator';
}

var g = myGenerator();

g.next(); // { value: 'hello', done: false }
g.next(); // { value: 'world', done: false }
g.next(); // { value: 'ending', done: true }
g.next(); // { value: undefined, done: true }

分析Generator的执行过程:

  1. 第一次调用,Generator函数开始执行,直到遇到第一个yield表达式为止
  2. 第二次调用,Generator函数从上次yield表达式停下的地方,一直执行到下一个yield表达式
  3. 第n-1次调用,Generator函数从上次yield表达式停下的地方,一直执行到return语句(如果没有return语句,就执行到函数结束)
  4. 第n次调用,Generator函数已经运行完毕,next方法返回对象的value属性为undefined,done属性为true

注意:

  • JavaScript的Generator只有调用next是才执行当前yield的代码
  • yield只能出现的Generator函数里面,不然会报错
  • yield表达式如果用在另一个表达式之中,必须放在圆括号里面console.log('Hello' + (yield 123))
  • next方法可以带一个参数,该参数就会被当作上一个yield表达式的返回值
  • for…of循环可以自动遍历 Generator 函数运行时生成的Iterator对象,且此时不再需要调用next方法

斐波那契数列

function* fn() {
    let [prev, curr] = [0, 1];
    while(true){
        yield curr;
        [prev, curr] = [curr, prev + curr];
    }
};

for (let n of fn()) {
    if (n > 1000) break;
    console.log(n);
}

回到顶部 目录

其他操作

  • Generator.prototype.throw([new Error()]):在函数体外抛出错误,然后在Generator函数体内(try…catch)捕获
  • Generator.prototype.return(value):返回给定的值,并且终结遍历Generator函数
  • 让Generator函数恢复执行,并且使用不同的语句替换yield表达式:
    • next()是将yield表达式替换成一个值
    • throw()是将yield表达式替换成一个throw语句
    • return()是将yield表达式替换成一个return语句
  • yield* 表达式:在一个Generator函数里面执行另一个Generator函数

对象中的Generator函数

let obj = {
    * Generator1(){
        yield 1;
    },
    Generator2 : function* (){
        yield 2;
    }
}

Generator函数实例化对象是无法使用this的,可以通过call来实现:

function* F() {
  this.a = 1;
  yield this.b = 2;
  yield this.c = 3;
}
var f = F.call(F.prototype);

f.next();  // Object {value: 2, done: false}
f.next();  // Object {value: 3, done: false}
f.next();  // Object {value: undefined, done: true}

f.a // 1
f.b // 2
f.c // 3

还可以将Generator函数调用方式改为构造函数:

function* gen() {
  this.a = 1;
  yield this.b = 2;
  yield this.c = 3;
}
function F() {
  return gen.call(gen.prototype);
}

var f = new F();

f.next();  // Object {value: 2, done: false}
f.next();  // Object {value: 3, done: false}
f.next();  // Object {value: undefined, done: true}

f.a // 1
f.b // 2
f.c // 3

回到顶部 目录

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值