Generator函数,ES6新增的函数,通过这个函数可以控制函数的执行步骤,也有说这是一个状态机,内部封装多个状态。执行Generator函数,不会立即这个函数方法,会返回一个遍历对象,可以依次遍历到函数中的每个状态或者说是每个特意要执行的步骤,至于这个返回的对象呢是指向函数内部表达式运行的开始,通过每次调用next依次执行到里面每步特别标注的步骤--yield注明或者return,而每次调用next方法返回的对象包含value(内部状态的值,yield后面的那个值)done(表示是否遍历结束或者说是里面的特别的步骤是否运行结束)。
Generator函数具体的表现形式:function 和函数名之间有个*,函数体内部的表达式包含 yield去定义一个特别表明的步骤(状态)。对于*的位置没有特别要求在function和函数名之间都行;yield放入别的函数表达式中必须加括号,但是作为参数声明或者变量赋值就不需要,next运行时碰到yield就会停止后续步骤执行,并返回yield后面那个表达式作为value,再次调用next接着执行直到遇到yield,如果遇不到yield的话 return也行,并将return后面的表达式作为value值,如果啥都遇不上就返回value是个undefined。generator函数的简写形式就是在函数名前加个*号,* fun
Generator函数的方法:next,依次运行到每个特殊注明的步骤,可携带一个参数表示上一个yield表达式返回的值(因此第一次next不用跟参数值从第二个next开始),通过这些个参数可以不同步骤阶段的不同的值进行不同的运算;for...of..遍历generator函数中的yield表达式。Generator函数返回的对象都包含一个throw方法抛出然后在Generator函数中catch的错误,如果函数内部没有catch而外部有就外部catch,如果都没有函数就报错,并且自带的throw方法之后自动执行一次next,但是如果在外部捕获的错误,那么generator函数就会停止执行。Generator函数的return方法(某个参数)结束函数执行并返回某个值或者undefined,如果存在try...finally..那么等finally 执行完再执行return。其中next、throw、return都可以使generator函数接着执行,不同在于next是正常执行,throw是抛出错误往下执行,return是终止程序。
在一个generator函数中调用另一个generetor函数没有作用,但是被调用的generator函数前面加上yield *那就可以正常执行了,但是使用yield的话返回的Generator函数返回的对象。 yield * 后面跟一个数组对象那么它将开始对数组对象的遍历,如果是yield 后面跟数组对象呢那就是返回数组对象。
Generator函数不能用作构造函数,因为它返回的总是一个遍历器对象,也不能跟new命令一起使用会报错。但是可以根据call改变函数内部的this指向生成对象实例或者直接使用Prototype。
状态机是能够根据控制信号按照预先设置状态进行位移,是协调相关信号动作、完成特定操作的控制中心。而generator函数的运行状态比较适合实现状态机的结构。Generator函数用途:异步操作的同步化表达(根据next方法),控制流管理,部署Iterator接口,作为数据结构。