2017-09-12更新
Generator函数
从语法上看,可以把它理解成状态机,封装了多种内部状态。
执行Generator函数会返回一个遍历器对象,代表Generator函数的内部指针。也就是说Generator除了是状态机还是一个遍历器对象生成器。返回遍历器对象,可以依次遍历Generator函数内部的每一个状态。
特征
- function和函数名之间有*号;
- 函数体内部用
yield
语句定义不同的内部状态。
调用
和普通函数调用一样。但是函数并不执行,必须调用next
方法,使得指针移向下一个状态,直到下一个yield
语句或return
语句。Generator函数是分段执行的,yield
语句是暂停执行的标记,next方法会恢复执行。
next
方法返回对象为{value: value; done: boolean}
,value
为yield语句的值,即内部状态的值,done
属性表示遍历是否结束。yield
语句不能用在普通函中,否则会报错。yield
语句本身没有返回值,或者说为undefined
,next
方法可以带一个参数,这个参数会被当作上一条yield
语句的返回值。但是引擎忽略next
方法时的参数,只有第二次使用next
方法带参数才是有效的。从语义上讲,第一次next
方法用来启动遍历器对象。for……of
自动遍历Generator函数,无需使用next
方法。
方法
Generator.prototype.return()
返回给定的值,并终结Generator函数的遍历
yield* 方法
在一个Generator函数中调用另一个Generator函数,默认是没有效果的。
而yield*
语句可以用来在一个Generator函数中调用另一个Generator函数