1.生成器函数:
function *generator(){ yeild "hello world" }
以*号声明的函数为生成器函数
2.调用生成器函数会生成一个迭代器对象,通过迭代器对象的next 方法调用一个生成器。
var iterator = generator()
iterator.next()
1)调用next方法的时候,生成器开始执行,遇到yeild关键字将会生成一个值(拥有value和done字段,当done字段为true时,则表示生成器已执行完毕)并挂起生成器的执行。
2)当调用下一个next方法的时候,生成器会从上一次挂起的地方开始继续执行,直到遇到下一个yeild,或者遇到return已经函数执行完毕
3)调用next方法时可以向生成器传递参数,若此时生成器为挂起状态,则参数将作为yeild关键字后面的表达式的值(第一次调用next时,生成器为非挂起状态,所以不能作为yeild后面表达式的值)
代码如下:
1 function *generator(val){ 2 val = yield val * 2 3 yield val 4 } 5 6 var iterator = generator(2) //调用迭代器generator, 生成一个迭代器并让iterator变量进行引用,此时向生成器传递了一个为2的参数,所以val的值为2 7 var result1 = iterator.next(3).value //第一次调用迭代器的next方法,生成器从第二行开始执行,计算val * 2的值(此时val的值为2,因为此时生成器并未挂起,所以next方法传递的参数将被丢弃),遇到yield关键字,将计算所得的值返回,并且生成器挂起,此时result1的值为 4 8 var result2 = iterator.next(5).value //第二次调用next方法,生成器从上次一挂起的位置继续执行(即第二行)此时next方法传递了参数5,因为此时生成器的状态为挂起状态,所以5将作为第二行yield关键字后面表达式的值,即 val * 2 = 5, 并将值赋值给 val变量,代码继续执行,到了第三行遇到yield关键字,将val变量的值返回(val的值为5),生成器执行完毕。