ES6 学习 -- Generator函数
(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函数的更多相关文章
- ES6的generator函数
generator是什么? generator是ES6提供的一种异步编程解决方案,在语法上,可以把它理解为一个状态机,内部封装了多种状态.执行generator,会生成返回一个遍历器对象.返回的遍历器 ...
- ES6学习--箭头函数
1. 箭头函数基本形式 let func = (num) => num; let func = () => num; let sum = (num1,num2) => num1 + ...
- ES6学习之函数扩展
函数默认参数 function test(x = 1, y = 2) { return x + y } test(5, 6) test() 若默认参数在必须参数之前,要想取得默认参数,只有当传入的值为 ...
- ES6 学习3 函数
1.函数默认参数 在ES5我们给函数定义参数默认值是怎么样? function action(num) { num = num || 200 //当传入num时,num为传入的值 //当没传入参数时, ...
- 【es6】Generator 函数
1. 基本概念 状态机,封装了多个内部状态 2. 应用 返回一个遍历器对象. 3. 代码形式 function* helloWorldGenertor() { yield 'hello'; yield ...
- ES6 学习 -- 箭头函数(=>)
(1).只有一个参数且只有一句表达式语句的,函数表达式的花括号可以不写let test = a => a; // 只有一个参数a,这里的表达式相当于 "return a" ( ...
- es6学习笔记-async函数
1 前情摘要 前段时间时间进行项目开发,需求安排不是很合理,导致一直高强度的加班工作,这一个月不是常说的996,简直是936,还好熬过来了.在此期间不是刚学会了es6的promise,在项目有用到pr ...
- ES6学习笔记(十五)Generator函数的异步应用
1.传统方法 ES6 诞生以前,异步编程的方法,大概有下面四种. 回调函数 事件监听 发布/订阅 Promise 对象 Generator 函数将 JavaScript 异步编程带入了一个全新的阶段. ...
- ES6学习笔记(十四)Generator函数
清明时节雨纷纷,路上行人欲断魂. 借问酒家何处有,牧童遥指杏花村. 二零一九年农历三月初一,清明节. 1.简介 1.1.基本概念 Generator 函数也是 ES6 提供的一种异步编程解决方案,据说 ...
随机推荐
- (¥1011)->(一千零一拾一元整)输出
public class RenMingBi { /** * @param args add by zxx ,Nov 29, 2008 */ private static final char[] d ...
- 第九篇 数据表设计和保存item到json文件
上节说到Pipeline会拦截item,根据设置的优先级,item会依次经过这些Pipeline,所以可以通过Pipeline来保存文件到json.数据库等等. 下面是自定义json #存储item到 ...
- Synchronizing Timer----集合点定时器
1.Number of Simulated Users to Group by:意思是比如设置是10,那会等到有10个线程到时候,才放行 2.Timeout in millilseconds:比如设置 ...
- mimikaz获取明文密码
一.windows2008以上不保存明文密码解决办法 mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords& ...
- ubuntu14.04标题栏显示上下网速
首先当然是用 wget 下载 indicator-sysmonitor,终端执行命令: wget -c https://launchpad.net/indicator-sysmonitor/trunk ...
- LVS DR模拟实验
准备多台服务器,现以三台服务器为例第一台做调度器 192.168.200.111[root@localhost ~]# iptables -F[root@localhost ~]# setenforc ...
- 本地项目上传github
(1)github上面新建仓库 (2) 1. git init //初始化仓库 2. git add .(文件name) //添加文件到本地仓库 3. git commit -m "firs ...
- jq-demo-放大镜
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Python自学:第四章 切片
# -*- coding: GBK -*- players = ['charles', 'martina', 'michael', 'florence', 'eli'] print(players[0 ...
- leetcode-两个数组的交集
C++解题方法: class Solution { public: vector<int> intersection(vector<int>& nums1, vecto ...