1. generator函数是什么
普通的js函数一旦执行,就会运行到最后或者遇见return才会结束,运行期间无法被打断,基于此种情况,ES6提供了generator函数,也叫生成器函数。
它是一种异步解决方案,形式上是函数,但是为了区别于普通函数,它拥有以下几个特征:
- 函数名前有一个*区分,例如:function * fun1 ( ) { ... } ,* fun2 ( ) { ... }
- 函数体内可以使用yield表达式,定义内部的不同状态,可以有多个yield,这也是和return 不同的地方。return 只能执行一次, 而yield 可以执行多次,注意:yeild只能在generator函数中使用,在其他地方使用会报错
- 直接调用generator函数并不会执行,而是会返回一个Iterator Object (遍历器对象),需要依次调用generator函数内部的next( )方法,来遍历函数内部的每个状态。generator 函数是分段执行的,yield表达式是暂停执行的标记,而next方法可以恢复执行。
- next方法的作用是分段执行generator函数,每次调用next( )方法,都会返回一个对象来表示当前阶段的信息 {value: " ", done: " " }, value 是yeild表达式后面的值,done是用来判断generator函数是否执行完毕,是否还有下一个阶段
//普通函数
function fun1() {
return "今天周一";
}
//普通函数需要调用
fun1 () //输出"今天周一"
//generator函数
function* fun2() {
yield "今天周一"
yield "明天周二"
return "后天周三"
}
let fun = fun2() //直接输出会返回一个Iterator对象,并不会执行
fun.next() //输出"今天周一"
fun.next() //输出"今天周二"
fun.next() //输出"今天周三"
fun.next() //输出 undefined