ES6 学习 -- Generator函数
(1)语法说明:Generator函数其实是一个普通函数,其有两个特点,一是,function关键字与函数名之间有一个星号(*);二是Generator函数内部使用yield表达式,定义不同的状态,然后分段的去执行,如下:
function * helloWorld() {
yield "hello";
yield "world";
return "end";
}
// 说明:定义一个Generator函数helloWorld,此时Generator函数内部有两个yield和一个return,表示存在三个状态:即两个yield表达式和一个return语句(结束语句)
// 调用Generator函数,返回一个指向Generator函数内部状态的指针对象,即遍历器对象(Iterator Object)
let hw = helloWorld();
// 调用遍历器对象的next方法,使得指针指向下一个状态,下次调用的时候,从函数头部或者上次停下来的地方开始往下执行,直到遇到最后一个yield或者return语句为止,yield表达式是暂停执行标记,而next方法则是恢复执行标记;遍历器对象的next方法的返回值是一个对象,该对象的value属性的值就是yield表达式的值,done属性的值是一个Boolean值,表示遍历是否结束,
hw.next()
(2)yield表达式
遇到yield表达式,暂停执行,并将yield后面的表达式的值,作为返回的对象的value属性的值;如果有return语句,return的返回值也作为返回对象的value属性的值;如果没有return语句,则返回的对象的value属性值为undefined
/*
yield表达式与return语句的区别:
共同点:都能返回语句后面表达式的值。
区别:每次遇到yield表达式,函数暂停执行,需要调用遍历器对象的next方法才会继续往下执行,而下次从该位置继续往后执行,而return语句没有位置记忆功能,且一个函数里只能执行一次return语句;而一个Generator函数里可以有多个yield表达式。
*/
(3)next方法的参数
// 第一个next方法带参数没有意义,因为第一个next是用来启动遍历器对象的,所有不用带参数;从第二个next开始,next的参数表示上一个yield表达式的返回值
(4)for...of循环遍历器对象
for...of循环可以自动变量Generator函数生成的遍历器对象,此时不需要调用next方法了,直接返回yield的表达式结果
function *foo() {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
return 6;
}
var hw = foo();
for (let item of hw) {
console.log(item); // 依次打印1 2 3 4 5
}
// 注意:使用for...of循环,一旦next方法返回的对象的done属性值为true,那么循环就会停止,for...of循环遇到return语句就立即停止,且只返回return语句之前的yield表达式值,return语句及return后面的yield表达式不会被返回。
// 在for...of循环之后再调用hw.next(),此时
ES6 学习 -- Generator函数的更多相关文章
- ES6的generator函数
generator是什么? generator是ES6提供的一种异步编程解决方案,在语法上,可以把它理解为一个状态机,内部封装了多种状态.执行generator,会生成返回一个遍历器对象.返回的遍历器 ...
- ES6学习--箭头函数
1. 箭头函数基本形式 let func = (num) => num; let func = () => num; let sum = (num1,num2) => num1 + ...
- ES6学习之函数扩展
函数默认参数 function test(x = 1, y = 2) { return x + y } test(5, 6) test() 若默认参数在必须参数之前,要想取得默认参数,只有当传入的值为 ...
- ES6 学习3 函数
1.函数默认参数 在ES5我们给函数定义参数默认值是怎么样? function action(num) { num = num || 200 //当传入num时,num为传入的值 //当没传入参数时, ...
- 【es6】Generator 函数
1. 基本概念 状态机,封装了多个内部状态 2. 应用 返回一个遍历器对象. 3. 代码形式 function* helloWorldGenertor() { yield 'hello'; yield ...
- ES6 学习 -- 箭头函数(=>)
(1).只有一个参数且只有一句表达式语句的,函数表达式的花括号可以不写let test = a => a; // 只有一个参数a,这里的表达式相当于 "return a" ( ...
- es6学习笔记-async函数
1 前情摘要 前段时间时间进行项目开发,需求安排不是很合理,导致一直高强度的加班工作,这一个月不是常说的996,简直是936,还好熬过来了.在此期间不是刚学会了es6的promise,在项目有用到pr ...
- ES6学习笔记(十五)Generator函数的异步应用
1.传统方法 ES6 诞生以前,异步编程的方法,大概有下面四种. 回调函数 事件监听 发布/订阅 Promise 对象 Generator 函数将 JavaScript 异步编程带入了一个全新的阶段. ...
- ES6学习笔记(十四)Generator函数
清明时节雨纷纷,路上行人欲断魂. 借问酒家何处有,牧童遥指杏花村. 二零一九年农历三月初一,清明节. 1.简介 1.1.基本概念 Generator 函数也是 ES6 提供的一种异步编程解决方案,据说 ...
随机推荐
- python中的缓存技术
python缓存技术 def console(a,b): print('进入函数') return (a,b) print(console(3,'a')) print(console(2,'b')) ...
- Delphi多线程详解
(整理自网络) Delphi多线程处理 1-1多线程的基本概念 WIN 98/NT/2000/XP 是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU 运行时间和资源,或者 ...
- 9、TestNG介绍与安装
介绍 TestNG是一个受JUnit和NUnit启发的测试框架,但引入了一些新功能,使其更加强大和易于使用,例如: 注释. 在任意大的线程池中运行你的测试,这些线程池有各种可用的策略(所有方法在他们自 ...
- python类的实例方法、静态方法和类方法区别及其应用场景
https://blog.csdn.net/helloxiaozhe/article/details/79940321 普通实例方法,第一个参数需要是self,它表示一个具体的实例本身. 如果用了st ...
- Windows7下命令行使用MySQL
我在Win7下安装的MySQL版本是mysql-5.0.22-win32 1.在Win7环境下安装MySQL,关于安装方法可以参考文章: Win7系统安装MySQL5.5.21图解教程.win7安装M ...
- 微信小程序--学习的案例
一.「程序秀」 「程序秀」这个小程序非常特别,因为它是一个可以帮助别人开发小程序的小程序.它以「即速应用」这个无需代码一键生成微信小程序的开发工具为基础,为广大开发爱好者提供小程序开发的最新资讯和培训 ...
- 微信小程序开发简易计算器改进版
微信小程序开发计算器有多种方法,但是大部分代码比较复杂.不容易理解.本案例进行了改进,主要是组件bindtap属性绑定的自定义函数clickBtn(),采用了switch语句,使得代码结构更加清晰,学 ...
- Dijkstra算法举例分析
题目如下: 如上图,设A为源点,求A到其他各顶点(B.C.D.E.F)的最短路径.线上所标注为相邻线段之间的距离,即权值.(注:此图为随意所画,其相邻顶点间的距离与图中的目视长度不能一 一对等). 解 ...
- Eureka注册中心是什么?
Eureka注册中心是什么? Eureka注册中心是什么? Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务.Spring Cloud将它集成在其子项目spring-clo ...
- Replication Controller、Replica Set
假如我们现在有一个Pod正在提供线上的服务,我们来想想一下我们可能会遇到的一些场景: 某次运营活动非常成功,网站访问量突然暴增 运行当前Pod的节点发生故障了,Pod不能正常提供服务了 第一种情况,可 ...