生成器:可以在一个函数块内暂停和恢复代码执行的能力,可以在函数名称前加一个星号来表示其为生成器(注意:箭头函数不能用来定义生成器函数) 调用生成器函数会产生一个生成器对象,该对象最开始是处于暂停执行的状态的(suspended),它有一个next方法可以让生成器开始或者恢复执行:
function*generatorFn(){}
const g = generatorFn();
console.log(g);//generatorFn{<suspended>}
console.log(g.next);//f next () {[native code]}
next方法:这个方法的返回值有一个done属性和一个value属性,函数体为空的生成器函数调用一次next()就会让生成器到达done:true的状态。value属性是生成器函数的返回值,默认值是undefined。 前面说了最开始调用生成器函数是产生一个生成器对象,它只有在初次调用next()方法后才会开始执行:
function*generatorFn(){
console.log('foobar');
}
let generatorObj = generatorFn();//初次调用不会打印日志
generatorObj.next();//foobar
yield关键字:让生成器停止和开始执行。生成器函数在遇到该关键词之前正常执行,遇到之后执行停止,只能通过调用next()方法恢复执行。当使用yield实现输入和输出的时候要注意第一次调用next()传入的值不会被使用,因为这次调用是为了开始执行生成器函数:
function* generatorFn(initial){
console.log(initial);
console.log(yield);
console.log(yield);
}
let generatorObj = generatorFn('foo');
generatorObj.next('bar');//foo
generatorObj.next('baz');//baz
generatorObj.next('qux');//quz
return()和throw():提前终止生成器