ES6新特性:生成器函数

本文详细介绍了JavaScript中的生成器函数,包括其定义、执行方式、yield语句的使用及返回值特性。通过实例展示了如何通过生成器解决回调地狱问题,强调了生成器在异步编程中的优势。

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

定义生成器函数

生成器函数和普通函数定义没有太大的差别,只是函数名前面多了一个*

function * gen(){
	console.log(111)
}

执行生成器函数

生成器函数直接调用函数不会执行,需要调用生成器函数内部的next方法函数才会执行

function * gen(){
	console.log(111)
}
let result = gen()
result.next()
//输出111

yield语句

yield语句会把函数分为几个部分,然后调用next函数异步去执行

function * gen(){
	console.log(111)
    yield one()
    console.log(222)
    yield two()
    console.log(333)
    yield three()
    console.log(444)
}
let result = gen()
result.next()
result.next()
result.next()
result.next()

上诉yield语句把函数分为4个部分
第一部分为

console.log(111)
    yield one()

第二部分为

console.log(222)
    yield two()

第三部分为

console.log(333)
 	yield three()

第四部分为

console.log(444)
yield语句的返回值:

生成器函数执行之后,yield语句内的值以对象的形式返回,value中对应着yield语句中的值,done:代表着这个函数的异步任务是否走到结尾,false(没有走到结尾),true(走到了结尾)

生成器函数的传参问题

  • 第一次调用生成器函数时的传参,为生成器的形参
    下面代码中的实参AAA对应着形参args
  • 第二个next传入的实参对应第一个yield语句的返回值
    下面代码中的实参CCC对应的第一个yield语句的返回值aaa
  • 第三个next传入的实参对应第二个yield语句的返回值
    下面代码中的实参DDD对应的第一个yield语句的返回值bbb
  • 第四个next传入的实参对应第三个yield语句的返回值
    下面代码中的实参EEE对应的第一个yield语句的返回值ccc
function * gen(args){
    console.log(args);
    let aaa =  yield '111'
    console.log(aaa);
    let bbb = yield '222'
    console.log(bbb);
    let ccc = yield '333'
    console.log(ccc);
}

gen函数的传参和调用问题
let result = gen('AAA')
//做为前一个yield整体的返回结果
console.log(result.next());
console.log(result.next('CCC'));
console.log(result.next('DDD'));
console.log(result.next('EEE'));
//输出结果
//AAA
//{ value: '111', done: false }
//CCC
//{ value: '222', done: false }
//DDD
//{ value: '333', done: false }
//EEE
//{ value: undefined, done: true }

讲完啦
在这里插入图片描述

谢谢大家的观看
关于生成器函数的一个扩展:
利用生成器函数解决回调地狱的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值