本节的内容,是建立在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. 数塔(杭电oj2084)

    Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大 ...

  2. 磅日波浪分析4H 20190927

    磅日的短线调整预计在132结束 目前已显现出ABC调整末端. 未来预计开启第五浪升势 破前期反弹高点.

  3. js 图片轮播简单版

    <html> <head> <meta charset="utf-8" /> <title></title> <s ...

  4. Ali_Cloud++:阿里云-单机版 solr4.10.3 安装部署

    本次案例演示:环境 1.solr-4.10.3.tgz.tgz 2.apache-tomcat-7.0.88.tar.gz 3.IKAnalyzer2012FF_hf1.zip 资源下载:Downlo ...

  5. JS中的栈和堆

    一.栈和堆 栈(stack):栈会自动分配内存空间,会自动释放,存放基本类型,简单的数据段,占据固定大小的空间. 基本类型:String,Number,Boolean,Null,Undefined 堆 ...

  6. js 中对于this 的理解的 经典案例

    function Foo(){ getName = function(){console.log(1);}; return this; }Foo.getName = function(){consol ...

  7. 1044 Shopping in Mars (25分)(二分查找)

    Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...

  8. Tkinter 控件

    文章更新于:2020-02-19 待翻译跟进 In this part of the Tkinter tutorial, we will cover some basic Tkinter widget ...

  9. 白话说编程之java线程

    线程和进程: 在说多线程之前,我们先来研究一下线程,说到线程,我们又不得不说到进程,因为很多初学者会把线程和进程分不清,搞混淆. 进程: 是操作系统系统运行的最小单元.怎么理解这句话,可以这样去对比, ...

  10. 【Canvas】(1)---概述+简单示例

    Canvas---概述+简单示例 如果通俗的去理解Canvas,我们可以去理解成它类似于我们电脑自带的画图工具一样,canvas首先是选择一块画布,然后在这个画布上描绘我们想画的东西,画好后展示给用户 ...