(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函数的更多相关文章

  1. ES6的generator函数

    generator是什么? generator是ES6提供的一种异步编程解决方案,在语法上,可以把它理解为一个状态机,内部封装了多种状态.执行generator,会生成返回一个遍历器对象.返回的遍历器 ...

  2. ES6学习--箭头函数

    1. 箭头函数基本形式 let func = (num) => num; let func = () => num; let sum = (num1,num2) => num1 + ...

  3. ES6学习之函数扩展

    函数默认参数 function test(x = 1, y = 2) { return x + y } test(5, 6) test() 若默认参数在必须参数之前,要想取得默认参数,只有当传入的值为 ...

  4. ES6 学习3 函数

    1.函数默认参数 在ES5我们给函数定义参数默认值是怎么样? function action(num) { num = num || 200 //当传入num时,num为传入的值 //当没传入参数时, ...

  5. 【es6】Generator 函数

    1. 基本概念 状态机,封装了多个内部状态 2. 应用 返回一个遍历器对象. 3. 代码形式 function* helloWorldGenertor() { yield 'hello'; yield ...

  6. ES6 学习 -- 箭头函数(=>)

    (1).只有一个参数且只有一句表达式语句的,函数表达式的花括号可以不写let test = a => a; // 只有一个参数a,这里的表达式相当于 "return a" ( ...

  7. es6学习笔记-async函数

    1 前情摘要 前段时间时间进行项目开发,需求安排不是很合理,导致一直高强度的加班工作,这一个月不是常说的996,简直是936,还好熬过来了.在此期间不是刚学会了es6的promise,在项目有用到pr ...

  8. ES6学习笔记(十五)Generator函数的异步应用

    1.传统方法 ES6 诞生以前,异步编程的方法,大概有下面四种. 回调函数 事件监听 发布/订阅 Promise 对象 Generator 函数将 JavaScript 异步编程带入了一个全新的阶段. ...

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

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

随机推荐

  1. RocktMq安装和简单使用以及报错收集

    文章目录 安装 使用 报错 总结: rocketmq内存设置 配置brockerip 启动方式 如果往机器上部署,最好再本地看看报错吗 关于防火墙 看总结去吧 安装 准备: jdk1.8 maven ...

  2. SQL中Truncate语法

    转自:http://www.studyofnet.com/news/555.html 本文导读:删除表中的数据的方法有delete,truncate, 其中TRUNCATE TABLE用于删除表中的所 ...

  3. 剑指offer——67左旋转字符串

    题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abc ...

  4. JHipster研究

    liquibase工作原理: master.xml用来维护所有变更记录文件引用 changelog文件夹用来保存具体的变更细节 系统启动时会比较master.xml中include的file,应用差异 ...

  5. 更改eclipse中jsp默认编码格式为UTF-8

        本文首发于cartoon的博客     转载请注明出处:https://cartoonyu.github.io/cartoon-blog     近段时间一直在学java三大框架,遇到了一个问 ...

  6. Cyclical Quest CodeForces - 235C 后缀自动机

    题意: 给出一个字符串,给出一些子串,问每个子串分别在母串中圆环匹配的次数, 圆环匹配的意思是将该子串拆成两段再首位交换相接的串和母串匹配,比 如aaab变成baaa,abaa,aaba再进行匹配. ...

  7. Android四大组件之Service浅见

    Service 是Android四大组件之一,可以在不显示界面的情况下在后台运行.还有一个作用是通过AIDL来实现进程间通信. Service的启动方式 Service的启动方式有两种,startSe ...

  8. js 万能判断

    console.log(Object.prototype.toString.call(123)) //[object Number] console.log(Object.prototype.toSt ...

  9. linux常用命令 满足99%的开发需要

    1.# 表示权限用户(如:root),$ 表示普通用户开机提示:Login:输入用户名password:输入口令 用户是系统注册用户成功登陆后,可以进入相应的用户环境.退出当前shell,输入:exi ...

  10. thinkphp 多语言支持

    ThinkPHP内置多语言支持,如果你的应用涉及到国际化的支持,那么可以定义相关的语言包文件.任何字符串形式的输出,都可以定义语言常量. 要启用多语言功能,需要配置开启多语言行为,在应用的配置目录下面 ...