本节的内容,是建立在iterator遍历器知识的基础上。所以希望还没有看上一节的内容的话,最好还是看一看,当然你如果熟悉iterator就没有那个必要了.

既然你都看到这里来了,就咱们就接着往下讲...

声明Generator函数

我们要学习的这个新函数叫做:Generator函数,又称生成器函数,是ES6的一个重要的新特性。

我们来看看这个函数张什么模样:

 //声明一个Hello的Generator函数
function* Hello(name) {
yield `hello ${name}`;
yield `how are you`;
yield `bye`;
}

上面这个就是Generator函数,乍一看,是不是跟普通的函数没什么两样?确实很像,但是我们要知道它有两个重要的区别:

  1. 普通函数用function来声明,Generator函数用function*声明。

  2. Generator函数内部有新的关键字:yield,普通函数没有。

PS:函数体内用到了ES6的新特性:字符串模板。第六节的内容,点击可以查看。

了解了Generator函数的声明方式,我们又多了两个疑问:

  1. Generator函数运行起来会发生什么?

  2. ****关键字yield语句的作用是什么?

调用Generator函数

带着这两个疑问我们往下看,我们试着就调用一下这个名字叫Hello的Generator函数,看看会发生什么:

 //声明一个Hello的Generator函数
function* Hello(name) {
yield `hello ${name}`;
yield `how are you`;
yield `bye`;
} //调用Hello函数
let ite = Hello('前端君');
//结果:[object Generator] ite.next();
//{value: "hello 前端君", done: false} ite.next();
//{value: "how are you", done: false} ite.next();
//{value: "bye", done: false} ite.next();
//{value: undefined, done: true}

看到这里,估计你也看到了一个熟悉的面孔:next()方法。(上一节iterator遍历器的内容)。

我们一起看看整个过程发生了什么:

一开始,我们调用Hello(“前端君”),函数执行后,返回了一个:[object Genrator]生成器对象,我们把它赋值到变量ite中,仅此而已,并没有做太多的事情。

接着,第1次调用生成器对象ite的next( )方法,返回了一个对象:

{value: "hello 前端君", done: false}

第2次调用生成器对象ite的next( )方法,同样得到了一个对象:

{value: "how are you", done: false}

第3次调用生成器对象ite的next( )方法,又得到了一个对象:

{value: "bye", done: false}

直到,第4次调用生成器对象ite的next( )方法,返回的对象:

{value: undefined, done: true}

看到这里有没有发现,这里生成器的next( )方法的和遍历器iterator的next( )方法的返回结果是不是一样?

没错,你可以把Generator函数被调用后得到的生成器理解成一个遍历器iterator,用于遍历函数内部的状态。(所以要求大家先学习第十三节iterator遍历器的知识)

Generator函数的行为

通过上面的案例,我们知道了:Generator函数被调用后并不会一直执行到最后,它**是先回返回一个生成器对象,然后hold住不动****,等到生成器对象的next( )方法被调用后,函数才会继续执行,直到遇到关键字yield后,又会停止执行,**并返回一个Object对象,然后继续等待,直到next( )再一次被调用的时候,才会继续接着往下执行,直到done的值为true。

yield语句的作用

而yield在这里起到了十分重要的作用,就相当于暂停执行并且返回信息。有点像传统函数的return的作用,但不同的是普通函数只能return一次,但是Generator函数可以有很多个yield。而return代表的是终止执行,yield代表的是暂停执行,后续通过调用生成器的next( )方法,可以恢复执行

next( )方法接收参数

此外,next( )方法还可以接受一个参数,它的参数会作为上一个yield的返回值,我们来看一下:

//声明一个Hello的Generator函数
function* Hello() {
let res = yield `hello`;
yield res;
} let iterator = Hello();
//结果:一个生成器对象 iterator.next();
//结果:{value: "hello", done: false} iterator.next("前端君");
//结果:{value: "前端君", done: false}

注意函数体内的第一个yield关键字,我们把它的返回值赋值给了一个变量res。

再看2次next方法的调用:

第1次调用next( )方法,返回的对象属性value值为“hello”,属性done值为:fasle,并暂停执行。

第2次next( )方法,传入参数:字符串“前端君”。此时,第二个yield关键字紧跟着的是变量res,而变量res的值正是上一个关键字yield的返回值。也就是说这个值正是我们传入的参数:“前端君”。因为:next( )的参数会作为上一个yield的返回值。

慢慢体会一下,理清逻辑,稍微有点绕。

关键字yield*

在一个Generator函数里面,如果我们想调用另一个Generator函数,就需要用到的关键字是:yield*。

我们来看看怎么玩,代码有点长,但是很好理解:

 //声明Generator函数:gen1
function* gen1() {
yield "gen1 start";
yield "gen1 end";
} //声明Generator函数:gen2
function* gen2() {
yield "gen2 start";
yield "gen2 end";
} //声明Generator函数:start
function* start() {
yield "start";
yield* gen1();
yield* gen2();
yield "end";
} //调用start函数
var ite = start();
//创建一个生成器 ite.next();
//{value: "start", done: false} ite.next();
//{value: "gen1 start", done: false} ite.next();
//{value: "gen1 end", done: false} ite.next();
//{value: "gen2 start", done: false} ite.next();
//{value: "gen2 end", done: false} ite.next();
//{value: "end", done: false}

我们主要看start( )这个Generator函数,其中有两句代码:

   yield* gen1();
yield* gen2();

这里使用了关键字yield*来实现调用另外两个Generator函数。从后面的多个next( )方法得到的结果看,我们可以知道:

** 如果一个Generator函数A执行过程中,进入(调用)了另一个Generator函数B,那么会一直等到Generator函数B全部执行完毕后,才会返回Generator函数A继续执行。**

Generator函数的用途

以上就是对Generator函数的讲解介绍,它是ES6的一个很重要的新特性。它可以控制函数的内部状态,依次遍历每个状态;可以根据需要,轻松地让函数暂停执行或者继续执行。

根据这个特点,我们可以利用Generator函数来实现异步操作的效果。

原理是:利用Generator函数暂停执行的作用,可以将异步操作的语句写到yield后面,通过执行next方法进行回调。

本节小结

总结:Generator函数是一种特殊的函数,可以使用关键字yield和next( )实现暂停和继续执行,而关键字yield*专门用于调用Generator函数,看似简单的特性,在实际开发中却有极大的用处。
更多前端学习内容文章干货请关注我的专栏(不断更新)

阿里名厂标准web前端高级工程师教程目录大全,从基础到进阶,看完保证您的薪资上升一个台阶

在这里我给大家准备了很多的学习资料
其实你与阿里工程师的差距只差这些东西

一种特殊的生成器函数-Generator函数的更多相关文章

  1. Generator函数语法解析

    转载请注明出处: Generator函数语法解析 Generator函数是ES6提供的一种异步编程解决方案,语法与传统函数完全不同.以下会介绍一下Generator函数. 写下这篇文章的目的其实很简单 ...

  2. 15.Generator 函数的语法

    Generator 函数的语法 Generator 函数的语法 简介 基本概念 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同.本章详细介绍 Generat ...

  3. ES6的新特性(16)——Generator 函数的语法

    Generator 函数的语法 简介 基本概念 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同.本章详细介绍 Generator 函数的语法和 API,它的 ...

  4. Generator 函数的语法

    简介 § ⇧ 基本概念 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同.本章详细介绍 Generator 函数的语法和 API,它的异步编程应用请看< ...

  5. Generator函数介绍

    Generator函数 基本概念 英文意思为 "生成器". generator函数是es6提供的一种异步编程解决方案,语法行为与传统函数完全不同.从状态上,首先我们把他理解成一种状 ...

  6. ES6学习笔记(十四)Generator函数

    清明时节雨纷纷,路上行人欲断魂. 借问酒家何处有,牧童遥指杏花村. 二零一九年农历三月初一,清明节. 1.简介 1.1.基本概念 Generator 函数也是 ES6 提供的一种异步编程解决方案,据说 ...

  7. generator函数与async/await

    理解async函数就要先理解generator函数,因为async就是Generator函数的语法糖 Generator 函数 Generator 函数是 ES6 提供的一种异步编程解决方案,可以先理 ...

  8. ES6入门之Generator函数

    Generator Generator函数是ES6提供的一种异步编程解决方案,Generator函数是一个状态机,封装了多个内部状态. 执行Generator函数会返回一个遍历器对象,也就是说,Gen ...

  9. JavaScript中的Generator函数

    1. 简介 Generator函数时ES6提供的一种异步编程解决方案.Generator语法行为和普通函数完全不同,我们可以把Generator理解为一个包含了多个内部状态的状态机. 执行Genera ...

随机推荐

  1. 数字反转 NOIp普及组2011

    当数字位数不确定时,如何反转呢? 本文为博客园ShyButHandsome原创作品,转载请注明出处 使用右侧目录快速浏览文章 题目描述 给定一个整数,请将该数各个位上数字反转得到一个新数. 新数也应满 ...

  2. js内置对象常用方法

    JS内置对象: ● String对象:处理所有的字符串操作 ● Math对象:处理所有的数学运算 ● Date对象:处理日期和时间的存储.转化和表达 ● Array对象:提供一个数组的模型.存储大量有 ...

  3. 关于C#三层架构中的“分页”功能

    新手上路,请多指教! 今天将分页功能实现了,要特别感谢坐在前面的何同学的指点,不胜感谢!功能的实现采用了三层架构的方式实现该功能,简述如下: 界面: DAL层有两个方法:“当前所在页”和“总页数” 这 ...

  4. 面试总结:关于MySQL事务的10个问题常见面试问答(FQA)

    学习关系型数据库MySQL是很好的切入点,大部分人工作中用惯了CRUD,对面试官刨根问底的灵魂拷问你还能对答如流吗?我们有必要了解一些更深层次的数据库基础原理. 文章每周持续更新,各位的「三连」是对我 ...

  5. Fiddler插件---将Mapi请求自动转为HTTPRunner测试用例(YAML格式)

    背景 继之前鼓捣出了Mapi解密插件之后,在团队内已经使用了三年之久,一跃成为团队最爱欢迎的测试工具之一(加个之一,低调谦虚一点). 随着团队推行HttpRunner搞接口自动化:编写和维护Case带 ...

  6. 路由与交换,cisco路由器配置,动态路由协议—RIP

    一.动态路由协议分类 动态路由协议包括IGP(内部网关协议)和EGP(外部网关协议). 1.IGP IGP又包括距离向量路由协议和链路状态路由协议. (1)距离向量路由协议典型代表:RIP (2)链路 ...

  7. 痞子衡嵌入式:走进二维码(QR Code)的世界(2)- 初体验(PyQt5.11+MyQR2.3+ZXing+OpenCV4.2.0)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是走进二维码(QR Code)的世界专题之初体验. 接上篇 <走进二维码(QR Code)的世界(1)- 引言> 继续更文,在 ...

  8. shell脚本编程(ubantu)

    项目 内容 这个作业属于那个课程 这里是链接 作业要求在哪里 这里是链接 学号-姓名 17041506-张政 作业学习目标 了解shell脚本的概念及使用:掌握shell脚本语言的基本语法:学习简单的 ...

  9. 04 jmeter使用方式3种

    1.手工添加配置元件编写 2.jmeter+badboy 工具录制---不建议使用 3.设置代理服务器(jmeter添加‘非测试元件-http代理服务器’,再添加一个线程组用来保留代理抓取的url,设 ...

  10. logback日志实战

    <?xml version="1.0" encoding="UTF-8" ?> <!-- <configuration> < ...