yield是什么
- yield是ES6的新关键字,使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者。它能够被认为是一个基于生成器的版本的return关键字。
- yield关键字实际返回一个IteratorResult(迭代器)对象,它有两个属性,value和done,分别表明返回值和是否完成。
- yield没法单独工做,须要配合generator(生成器)的其余函数,如next,懒汉式操做,展示强大的主动控制特性。
yield应用的简单例子
- 若是你看到某个函数中有yield,说明这个函数已是个生成器了
- yield能够用来增强控制,懒汉式加载
- 调用函数指针和调用生成器是两码事,注意上面的运行结果,countAppleSales和myArr。
- 须要next()函数配合使用,每次调用返回两个值:分别是value和done,表明迭代结果和是否完成
- 函数next()是个迭代器对象,传参能够缺省,默认调用函数。
错误的调用
上述错误的调用中,会的到以下结果
{ value: 7, done: false }
{ value: undefined, done: true }前端
由于在while判断中的next也会进行消耗,致使输出结果与预期不符,获得的只是符合条件的偶数项node
一些说明
- yield并不能直接生产值,而是产生一个等待输出的函数
- 除IE外,其余全部浏览器都可兼容(包括win10 的Edge)
- 某个函数包含了yield,意味着这个函数已是一个Generator
- 若是yield在其余表达式中,须要用()单独括起来
- yield表达式自己没有返回值,或者说老是返回undefined(由next返回)
- next()可无限调用,但既定循环完成以后老是返回undeinded
next()函数及参数
-
在js中,虽然借鉴了python的函数,可是也进行了本身的改造,因为没有send()函数,因此没法直接传递yield的值。python
-
next()能够带一个参数,该参数会被认为是上一个yield总体的返回值,稍后将在代码中展现。git
-
在某种程度上,next()能够直接当作send()使用github
它的意义在于,能够在不一样阶段从外部直接向内部注入不一样的值来调整函数的行为(这一点是其余循环很难作到的,或要付出较大的代价才能够作到)后端
yield参数的对比
- 对js中generator函数进行改造,对比右边的python中的yield,它们原理同样,只是调用方式不一样
- 调用next(),会产生许多i的值, 可是不会影响reset,由于yield直接将值return出来了。
- 当传值true后,yield及他的参数总体变为true赋值给reset,这是reset会被执行,从而知足循环内的判断条件
- 这里的使用 next(参数) 已经达到了send(参数)的效果
- 这并不会平白增长循环的时间复杂度,由于不传参的时候,并不会占用更多的内存
更深层次的理解yield
若是刚才没有让你有一个清晰的认识,那么这个例子必定会让你完全明白的浏览器
分析
next() 传参是对yield总体的传参,不然yield相似于return函数
A组
- x恒为5,因此第一次调用传空没问题,可获得对应的第一个yield返回值:yield (x + 1)
- 第二次调用,无参数传入,因此y为NaN(2* undefined),天然得不到z
- 第三次调用同上分析
B组
- x恒为5,因此第一次调用传空没问题,可获得对应的第一个yield返回值:yield (x + 1)
- 第二次调用,传入12,因此y为24(yield (x + 1)=入参),获得第二个yield: yield (y / 3)=8
- 第三次调用同上分析,获得最后的z值并return=42
目前项目中的可用性
在前端项目中,用的机会不多,彻底能够忽略他的存在,可是在后台项目中,就显得比较重要了,由于其优越的可控性,但是极大的提高线程的效率。spa
目前只是根据官网,ES6规范,大站等总结出来的,可是很遗憾,目前咱们的项目中因为node项目较简单,并不须要进行实际改造。线程
若是须要实例的话,可参考github上的一些python后端项目,调用方式稍有不一样,因为js参考的python语言,他们又同为动态语言,因此原理都是相同的,用处也同样。
转载自:世外大帝
连接:https://www.jianshu.com/p/36c74e4ca9eb
来源:简书