生成器是ES6中新增的一个极为灵活的结构,拥有在一个函数块内暂停和恢复代码执行的能力。
1.生成器基础
生成器的形式是一个函数,函数名称前带星号(*)表示他是一个生成器。只要是能够定义函数的地方,就能够定义生成器(箭头函数不能用来定义生成器)函数
function *generatorFn(){} //生成器函数声明
调用生成器函数会产生一个生成器对象。生成器对象一开始处于暂停执行状态(suspended)。与迭代器类似,生成器对象也实现了Iterator接口,所以具备next()方法。调用这个方法会让生成器开始或恢复执行
next()方法的返回值相似于迭代器,有一个done属性和一个value属性。函数体为空的生成器函数中间不会停留,调用一次next()就会让生成器到达 done:true 状态code
function *generatorFn(){} const g = generatorFn(); console.log( g ); //generatorFn{ <suspended> } console.log( g.next ); //f next() { [native code] } console.log( g.next() ); //{ done:true, value:undefined }
value属性是生成器函数的返回值,默认为undefined,能够经过生成器函数的返回值指定:对象
function *generatorFn(){ return 'foo'; } ...... console.log( g.next() ) //{ done:true, value:'foo' }
生成器函数只会在初次调用next()方法后开始执行接口
生产器对象实现了Iterator接口,他们默认的迭代器是自引用的generator
function *generatorFn() {} console.log( generatorFn ); //f* generatorFn() {} console.log( generatorFn()[Symbol.iterator] );//f [Symbol.iterator]() {native code} console.log( generatorFn() ); //generatorFn{ <suspended> } console.log( generatorFn()[Symbol.iterator] ); //generatorFn{ <suspended> }
2.经过yield中断执行it