首页 > 其他 > 详细

yield,生成器

时间:2020-07-02 10:15:06      阅读:60      评论:0      收藏:0      [点我收藏+]

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

 

yield,生成器

原文:https://www.cnblogs.com/lyc10/p/13222548.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!