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),生成器执行完毕。

 

posted on 2020-07-02 01:04  就是10  阅读(142)  评论(0编辑  收藏  举报