一种特殊的生成器函数-Generator函数
本节的内容,是建立在iterator遍历器知识的基础上。所以希望还没有看上一节的内容的话,最好还是看一看,当然你如果熟悉iterator就没有那个必要了.
既然你都看到这里来了,就咱们就接着往下讲...
声明Generator函数
我们要学习的这个新函数叫做:Generator函数,又称生成器函数,是ES6的一个重要的新特性。
我们来看看这个函数张什么模样:
//声明一个Hello的Generator函数
function* Hello(name) {
yield `hello ${name}`;
yield `how are you`;
yield `bye`;
}
上面这个就是Generator函数,乍一看,是不是跟普通的函数没什么两样?确实很像,但是我们要知道它有两个重要的区别:
普通函数用function来声明,Generator函数用function*声明。
Generator函数内部有新的关键字:yield,普通函数没有。
PS:函数体内用到了ES6的新特性:字符串模板。第六节的内容,点击可以查看。
了解了Generator函数的声明方式,我们又多了两个疑问:
Generator函数运行起来会发生什么?
****关键字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函数的更多相关文章
- Generator函数语法解析
转载请注明出处: Generator函数语法解析 Generator函数是ES6提供的一种异步编程解决方案,语法与传统函数完全不同.以下会介绍一下Generator函数. 写下这篇文章的目的其实很简单 ...
- 15.Generator 函数的语法
Generator 函数的语法 Generator 函数的语法 简介 基本概念 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同.本章详细介绍 Generat ...
- ES6的新特性(16)——Generator 函数的语法
Generator 函数的语法 简介 基本概念 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同.本章详细介绍 Generator 函数的语法和 API,它的 ...
- Generator 函数的语法
简介 § ⇧ 基本概念 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同.本章详细介绍 Generator 函数的语法和 API,它的异步编程应用请看< ...
- Generator函数介绍
Generator函数 基本概念 英文意思为 "生成器". generator函数是es6提供的一种异步编程解决方案,语法行为与传统函数完全不同.从状态上,首先我们把他理解成一种状 ...
- ES6学习笔记(十四)Generator函数
清明时节雨纷纷,路上行人欲断魂. 借问酒家何处有,牧童遥指杏花村. 二零一九年农历三月初一,清明节. 1.简介 1.1.基本概念 Generator 函数也是 ES6 提供的一种异步编程解决方案,据说 ...
- generator函数与async/await
理解async函数就要先理解generator函数,因为async就是Generator函数的语法糖 Generator 函数 Generator 函数是 ES6 提供的一种异步编程解决方案,可以先理 ...
- ES6入门之Generator函数
Generator Generator函数是ES6提供的一种异步编程解决方案,Generator函数是一个状态机,封装了多个内部状态. 执行Generator函数会返回一个遍历器对象,也就是说,Gen ...
- JavaScript中的Generator函数
1. 简介 Generator函数时ES6提供的一种异步编程解决方案.Generator语法行为和普通函数完全不同,我们可以把Generator理解为一个包含了多个内部状态的状态机. 执行Genera ...
随机推荐
- 关于C#中Partial局部类型关键字的使用
虽然之前在做Winform开发时候,经常遇到Partial关键字,但是最近在代码中看到使用Partial将同名类文件写在多个源文件中,因此想要记录下Partial的详细使用. Partial type ...
- C - Can you solve this equation? HDU - 2199(二分水题)
Now,given the equation 8x^4 + 7x^3 + 2x^2 + 3x + 6 == Y,can you find its solution between 0 and 100; ...
- adb工作常用命令
adb devices 查看手机名 adb shell链接手机 dumpsys window windows |grep -i current 打开软件,查看软件入口,和包名,白色为包名,红框为包入口 ...
- 创建堆(python)
创建最大(小)堆 二叉堆本质上是一种完全二叉树,存储方式并不是链式存储,而是顺序存储 堆操作:插入(叶子节点上调),删除(堆顶元素下沉) 堆创建:非叶子节点下沉(从最后一个非叶子节点开始) 最小堆: ...
- 基于 Jepsen 来发现几个 Raft 实现中的一致性问题(2)
Nebula Graph 是一个高性能.高可用.强一致的分布式图数据库.由于 Nebula Graph 采用的是存储计算分离架构,在存储层实际只是暴露了简单的 kv 接口,采用 RocksDB 作为状 ...
- 手动搭建I/O网络通信框架4:AIO编程模型,聊天室终极改造
第一章:手动搭建I/O网络通信框架1:Socket和ServerSocket入门实战,实现单聊 第二章:手动搭建I/O网络通信框架2:BIO编程模型实现群聊 第三章:手动搭建I/O网络通信框架3:NI ...
- 文件上传——客户端检测绕过(JavaScript检测)(一)
前言 通常再一个web程序中,一般会存在登陆注册功能,登陆后一般会有上传头像等功能,如果上传验证不严格就可能造成攻击者直接上传木马,进而控制整个web业务控制权.下面通过实例,如果程序只进行了客户端J ...
- AJ学IOS(15)UI之曾经大热的打砖块小游戏
AJ分享,必须精品 先看效果图 代码 // ViewController.m // 打砖块 // // Created by liufan on 13-8-17. // Copyright (c) 2 ...
- 08-less预处理器
一.less预处理器 Less(LeanerStyle Sheets 的缩写)是一门 CSS扩展语言,也成为CSS预处理器. 1.插件安装 安装Easy LESS插件就能使写入的.less文件保存时自 ...
- 《SQL 反模式》 学习笔记
第一章 引言 GoF 所著的的<设计模式>,在软件领域引入了"设计模式"(design pattern)的概念. 而后,Andrew Koenig 在 1995 年造了 ...