对ES6的yield示例分析

时间: 2019-01-07阅读: 1347标签: es6

近期ES6标准如火如荼的发展,其中主要还是各大浏览器的支持,最重要厂商支付宝,微信的支持,使得国内的发展也很迅猛。

这里主要是对yield关键字的,yield实际上可以看作是一种新的中断机制,大家都知道JavaScript函数执行是顺序的,中途没有暂停,等待消息只能通过回调或者settimeout等延迟检查来完成。

有些示例说yield和线程有关系,不过我在官方示例中没看出来,好了进入主题,先来看看官方示例。

function *foo(x){
var y=2*(yield(x+1));
var z=yield(y/3);
return (x+y+z);
}
 
var it=foo(5);
console.log(it.next());
console.log(it.next(12));
console.log(it.next(13));
//返回值是{value: 6, done: false},{value: 8, done: false},{value: 42, done: true}


第一点:foo需要是*型的,新增的*带来的是这个函数指针,这个函数必须是*型的,否则的话var it=foo(5),就表示得到函数执行的结果,而指针型的,表示it取得该函数。

第二点:第一个it.next()表示开始执行函数,直到第一个yield停止。返回值是yield(表达式的值),这个时候的返回时是x+1,x是5,结果就是6. 这里的it.next如果带参数,则参数会被忽略,因为首次执行没有参数可再传递.

第三点:第二个it.next(12)表示上一个yield的返回结果是12,带进去也就是var y=2*12; 这个地方必须带值,因为yield内是表达式(x+1),不是常量,无法自己计算,这里为什么不把之前的x缺省带进去计算,只能说目前的机制不是这样,

应该是考虑到实现的复杂程序,因为这里的x是一个变量,实际运行中,这个还可能是表达式,甚至还有作用域的问题考虑,这里计算出的y=2*12=24,一直计算到下一个yield(24/3),结果是8。

第四点:第三个it.next(13)同样表示上一个yield的返回结果是13,带进去也就是var z=13;后面已经没有yield了,就去函数的返回值return 5+24+13,结果等于42,这个时候done的值是true,表示函数结束。

重要的总结下:function需要是指针,记住yield(表达式)执行的结果是上一个执行的值。

这样yield的关键字是不是清晰了?

在实际工作中并不是it.next()一定要到函数最终的return, 例如第一次执行it.next(),取得返回值不符合预期的值,可以直接不执行后期的next了,例如多层校验。


来自:https://www.cnblogs.com/zhujiechang/p/10229402.html


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/1782

ES6 Decorator_js中的装饰器函数

ES6装饰器(Decorator)是一个函数,用来修改类的行为 在设计阶段可以对类和属性进行注释和修改。从本质上上讲,装饰器的最大作用是修改预定义好的逻辑,或者给各种结构添加一些元数据。

ES6 - let、const、var的区别

为了使JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言,ECMAScript 6.0(简称ES6)在标准中添加了很多新的特性。我们将用几篇文章总结一下ES6标准中一些常用的新特性。本片文章主要讲解ES6中的let、const命令,并区分其与var命令的区别。

jses6语法:Iterator遍历器 promise async函数

Iterator遍历器他是一种接口,为不同的数据结构体用统一的访问机制,接口部署在数据结构的Symbol.Iterator属性,或者说一个数据结构只要具备Symbol.Iterator属性就认为是可以遍历的

Js ES6代理的实际用例

元编程是一种强大的技术,使你能够编写可以创建其他程序的程序。ES6借助代理和许多类似功能,使在JavaScript中利用元编程变得更加容易。ES6 Proxy(代理) 有助于重新定义对象的基本操作,从而为各种可能性打开了大门。

ES6中对象新增了哪些扩展?

ES6中,当对象键名与对应值名相等的时候,可以进行简写;ES6 允许字面量定义对象时,将表达式放在括号内;this 关键字总是指向函数所在的当前对象,ES6 又新增了另一个类似的关键字 super ,指向当前对象的原型对象

关于ES6的let和const

var存在的问题可以重复声明,无法限制修改,没有块级作用域 (在全局范围内有效),存在变量提升

ES6迭代器精炼讲解

Iterator 是 ES6 引入的一种新的遍历机制,迭代器有两个核心概念:迭代器是一个统一的接口,它的作用是使各种数据结构可被便捷的访问,它是通过一个键为Symbol.iterator 的方法来实现。

es6-快速掌握Proxy、Reflect

ES6新增的代理和反射为开发者提供了拦截并向基本操作嵌入额外行为的能力。具体地说,可以给目标对象定义一个关联的代理对象,而这个代理对象可以作为抽象的目标对象来使用。在对目标对象的各种操作影响目标对象之前

基于ES6的tinyJquery

Query作为曾经Web前端的必备利器,随着MVVM框架的兴起,如今已稍显没落。用ES6写了一个基于class简化版的jQuery,包含基础DOM操作,支持链式操作...

ES6 中的一些技巧,使你的代码更清晰,更简短,更易读!

ES6 中的一些技巧:模版字符串、块级作用域、Let、Const、块级作用域函数问题、扩展运算符、函数默认参数、解构、对象字面量和简明参数、动态属性名称、箭头函数、for … of 循环、数字字面量。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!