ES6——generator与yield

本文详细讲解了ES6中的Generator函数,重点介绍了其特点如暂停执行和遍历器对象,以及yield关键字的运用。通过实例演示了yield如何控制执行流程和返回值。同时涵盖了async_await的关系和yield对象的结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Generator生成器函数

它是ES6新推出的一种异步编程解决方案,与普通函数的区别:函数名前多了一个星号,与yield关键字配合使用,实现暂停执行的功能。

1. 特点

  • 函数名前多了一个星号*
  • 直接调用 Generator函数并不会执行,也不会返回运行结果,而是返回一个遍历器对象(Iterator Object)
  • 依次调用遍历器对象的next方法,遍历 Generator函数内部的每一个状态
  • 函数体内使用 yield,定义不同的内部状态 ,会暂停执行

例如:
以下是一个生成器函数

function *generator(x) {
    console.log('x', x);
}

此时我们直接执行generator(10)
在这里插入图片描述
发现竟然什么也没输出?说明根本没有执行console.log(x,'x’)


所以我们应该着重注意generator函数的特点:
generator返回的是一个遍历器对象;
调用遍历器对象的next才可以执行函数;

function *generator(x) {
    console.log('x', x);
}
const a = generator(10);
a.next();

当我们用一个变量接住generator返回的遍历器对象,并调用next方法,就执行了console语句!
在这里插入图片描述

生成器函数的执行就像挤牙膏,被人挤一下才出来一点

2. 关联概念

async_await:原理基于generator实现

二、yield的加入

1. 引入

在上面的例子新增两个语句,其中一句是yield表达式,一个是正常的log语句

function *generator(x) {
    console.log('x', x);
    let b = yield x;			//新增语句
    console.log('b', b)			//新增语句
}

let a = generator(10);
console.log(a.next());

让我们来看看结果是什么?
在这里插入图片描述
与上述例子相同的是仍然输出了x 10,但是第二个console并没有被执行,反而返回了一个对象{value:10, done:false}

==推断=>

程序的执行已经卡在yield语句那一行并且返回了一个对象

2. yield 特点

yield的返回是一个对象,包括 value 和 done 两部分:

  • value:返回值
  • done:generator函数是否执行完。false表明该函数后续还有可以执行的部分,反之则无

并且当在generator函数执行中遇到yield就会中断,只有进行下一次next()才会执行下一段代码(下一个yield之前的一段)

三、举个例子

function *generator(x) {
    console.log('x', x);
    let b = yield x;		//第一次next执行到此行
    console.log('x_after', x);
    console.log('b', b);
    yield "hello";			//第二次next执行到此行
    console.log('end');
}
let a = generator(10);
console.log(a.next());
console.log(a.next(1000));

结果:
在这里插入图片描述

  1. 第二次调用next执行的语句块是两个yield之间的内容

  2. 调用next()时,传入一个值1000:
    再次打印x,x的值仍未10。但用b接收yield语句,b变为1000,说明 next()传进去的值会被yield接收作为自己的值,并可以返回给接收的变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你脸上有BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值