一、什么是生成器函数?

生成器函数是ES6的新特性之一,它是一个在执行时能中途暂时退出,后面重新调用又能重新进入继续执行的一种函数。

并且在函数内定义的变量的所有状态不受中途退出的影响。

二、语法

声明方式:

function* 函数名([参数1[, 参数2[, ... 参数n]]]) { JS语句 }

调用说明:

1) 调用生成器对象时会返回一个生成器的迭代器

2) 该迭代器中有一个next()方法,它返回一个包含value和done的对象

3) 每次调用next()方法遇到yied表达式位置暂停执行

4) value表示yied表达式的返回值,done表示该生成器最后一个值是否已经产生

5)如果给next()方法传递参数, 参数的值会代替yied表达式的返回值

6)  如果在生成器中调用return,生成器将提前完成

三、示例

1、定义一个自增生成器函数,每次next()调用返回自增的值

输出如下:

>1  false
>2 false
>3 false
>4 false //想想为什么是false?
>undefined true

我们做了什么事:

1)  声明一个生成器函数increment(n),每次判断小于n时自增

2) 每次自增用yield表达式,返回表达式的值,然后自增(因为是后缀++)

function* increment(n){
var index = 1;
while(index<n)
yield index++;
}

3) 调用生成器函数,返回一个迭代器对象,赋给变量it

var it = increment(5);

4)  for循环遍历

//为什么要多声明一个temp变量?
for(let i = 0; i<5; i++)
{
let temp = it.next();
console.log(temp.value);
console.log(temp.done);
}

直接使用it.next()

for(let i = 0; i<5; i++)
{
console.log(it.next().value);
console.log(it.next().done);
} //输出为:1, false, 3, false, undefined, true, undefined, true, undefined, true

2、给next()传递参数

function* increment(){
let index = 1;
console.log(yield index++);
console.log(yield index++);
console.log(yield index++);
} var it = increment(); it.next();
it.next(3);
it.next(9);

输出为:3,9

3、显式返回

function* increment(){
let index = 1;
yield index++;
return "complete";
yield index++;
yield index++;
} var it = increment(); console.log(it.next().value); { value: 1, done: false }
console.log(it.next().value); { value: "complete", done: true }
console.log(it.next().value); { value: undefined, done: true }

四、补充

yield*

语法:

yield* [[表达式]]

说明:

yield* expression 用于委托给另一个generator或可迭代对象。

栗子:

function* increment_slowly(){
let index = 1.1;
yield index = 1.2;
yield index += 0.11;
} function* increment(){
let index = 1;
yield index++;
yield* increment_slowly();
yield index++;
} var it = increment(); console.log(it.next().value); // >1
console.log(it.next().value); // >1.2
console.log(it.next().value); // >1.31
console.log(it.next().value); // >2

题外话:这个排版有点丑,打算去看看博客园怎么排版,下一篇文章做做排版,更加清晰地显示。

ES6新特性之生成器函数 (generator function): function*的更多相关文章

  1. 轻松学会ES6新特性之生成器

    生成器虽然是ES6最具魔性的新特性,但也是最难懂得的一节,笔者写了大量的实例来具体化这种抽象的概念,能够让人一看就懂,目的是希望别人不要重复或者减少笔者学习生成器的痛苦经历. 在说具体的ES6生成器之 ...

  2. ES6新特性:Javascript中Generator(生成器)

    ES6的很多特性都跟Generator扯上关系,而且实际用处比较广, 包含了任何需要异步的模块, 比如ajax, filesystem, 或者数组对象遍历等都可以用到: Generator的使用: G ...

  3. ES6新特性之箭头函数与function的区别

    写法不同 // function的写法 function fn(a, b){ return a+b; } // 箭头函数的写法 let foo = (a, b) =>{ return a + b ...

  4. ES6新特性3:函数的扩展

    本文摘自ECMAScript6入门,转载请注明出处. 一.函数参数默认值 1. ES6允许为函数的参数设置默认值,即直接写在参数定义的后面. function log(x, y = 'World') ...

  5. es6新特性之箭头函数

    <script> { // es3,es5 var evens = [1, 2, 3, 4, 5]; var odds = evens.map(function (v) { return ...

  6. ES6新特性三: Generator(生成器)函数详解

    本文实例讲述了ES6新特性三: Generator(生成器)函数.分享给大家供大家参考,具体如下: 1. 简介 ① 理解:可以把它理解成一个函数的内部状态的遍历器,每调用一次,函数的内部状态发生一次改 ...

  7. ES6生成器函数generator

    ES6生成器函数generator generator是ES6新增的一个特殊函数,通过 function* 声明,函数体内通过 yield 来指明函数的暂停点,该函数返回一个迭代器,并且函数执行到 y ...

  8. ES6新特性(函数默认参数,箭头函数)

    ES6新特性之 函数参数的默认值写法 和 箭头函数. 1.函数参数的默认值 ES5中不能直接为函数的参数指定默认值,只能通过以下的变通方式:   从上面的代码可以看出存在一个问题,当传入的参数为0或者 ...

  9. ES6新特性简介

    ES6新特性简介 环境安装 npm install -g babel npm install -g babel-node //提供基于node的REPL环境 //创建 .babelrc 文件 {&qu ...

随机推荐

  1. MarsEdit快速插入源代码

    开始用MarsEdit来写博文,客户端的,毕竟是要方便的多啊. 遇到的第一个问题就是:MarsEdit没有提供快速插入源代码的工具,而对于我这枚码农而言,这个就有点太杯具了. 简单研究了一下,发现Ma ...

  2. Python 文件对象

    Python 文件对象 1) 内置函数 open() 用于打开和创建文件对象 open(name,[,mode[,bufsize]]) 文件名.模式.缓冲区参数 mode: r 只读 w 写入 a 附 ...

  3. C/C++中对链表操作的理解&&实例分析

    链表概述 链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.它可以根据需要开辟内存单元.链表有一个“头指针”变量,以head表示,它存放一个地址.该地址指向一个元素.链表中每一个元素称 ...

  4. 【Stack Overflow -- 原创加工、原创整理、生产实战】-- 深度复制

    一.说明 1.本程序的核心代码不是我原创的,是我在Stack Overflow上搜集后加工出来的,原作者已忘记了~ 2.这段程序是我在上海携程(2014年左右)上班时整理并在生产环境应用的,先后经历了 ...

  5. Java虚拟机:内存模型详解

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 我们都知道,当虚拟机执行Java代码的时候,首先要把字节码文件加载到内存,那么这些类的信息都存放在内存中的哪个区域呢?当我们创建一个对象实 ...

  6. 【3D计算机图形学】变换矩阵、欧拉角、四元数

    [3D计算机图形学]变换矩阵.欧拉角.四元数 旋转矩阵.欧拉角.四元数主要用于:向量的旋转.坐标系之间的转换.角位移计算.方位的平滑插值计算.   一.变换矩阵: 首先要区分旋转矩阵和变换矩阵: 旋转 ...

  7. Xcode导出App一般问题及其解决方法(开发者协议变更及Bundle Id过期问题)

    Xcode导出App一般问题及其解决方法 问题一:开发者协议变更问题. 变更后打包会出现如下图A警告,此时点击 "visit developer website"进入Apple开发 ...

  8. zoj 3963 heap partion

    https://vjudge.net/problem/ZOJ-3963 题意: 给出一个数列,可以用这个数列构造一种二叉树,这个二叉树满足数的下标 i <= j,并且 si <= sj,s ...

  9. Windows远程linux服务器执行shell命令

    一.前言 借用百度百科关于putty的描述:PuTTY是一个Telnet.SSH.rlogin.纯TCP以及串行接口连接软件.较早的版本仅支持Windows平台,在最近的版本中开始支持各类Unix平台 ...

  10. JAVA入门[22]—thymeleaf

    一.thymeleaf官网 官网:https://www.thymeleaf.org/index.html doc:https://www.thymeleaf.org/documentation.ht ...