Generataor函数理解

121 阅读20分钟

Generator是ES6的一种新的特性,是一种异步编程的方案。首先可以理解成一个状态机,内部封装了多个状态。执行时,会返回一个遍历器对象,从这里理解,也可以说是一个遍历器生成对象。

格式如上:1.funtion关键字与函数名之间有一个*;2.内部使用yield表达式定义不同的状态。

使用方法:调用该函数时接next方法才能将指针移向下一个状态,调用一次,执行状态一个,然后停下,内部是分段执行的,yield是暂停执行的标记。

每次调用next(),就会返回一个有着value和done两个属性的对象。value代表当前的内部状态的值,是yield表达式后面的表达式的值;done属性是一个布尔值,表示是否遍历结束,结束时返回true。

yield表达式特性

1.只能在generator函数使用,否则报错;

2.调用next,才能执行下一个yield表达式

与Iterator(迭代器)接口的关系:

由于任意对象的Symbol.iterator方法,等于该对象的遍历器生成函数,调用该函数返回一个该对象的一个遍历器对象:

Generator 函数赋值给Symbol.iterator属性,从而使得myIterable对象具有了 Iterator 接口,可以被...运算符遍历了。

next()方法是将上一次的yield替换成一个值(第一次不替换);格式像这样next(1),如果没有,即替为undefined

throw()方法:是将yield表达式替换成一个throw语句

return()是将yield表达式替换成一个return语句,终结遍历

for...of循环可以自动遍历Generator函数运行时生成的Iterator对象,且此时不再需要调用next方法

利用for...of循环,可以写出遍历任意对象(object)的方法。原生的 JavaScript 对象没有遍历接口,无法使用for...of循环,通过 Generator 函数为它加上这个接口,就可以用了。

参考自:阮一峰《ES6》