ES6学习笔记<三> 生成器函数与yield
为什么要把这个内容拿出来单独做一篇学习笔记?
生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数。
标题为什么是生成器函数与yield?
生成器函数类似其他服务器端语音中的接口(Interface),yield则是生成器函数中表示 返回 或 继续 执行的关键字。
弄清楚这两个概念后,先看一个例子:
function* fun(val) {
yield 1*val;
yield 2*val;
yield 3*val;
yield 4*val;
return 5*val;
}
var add = fun(5); // 调用函数后不会运行,而是返回指向函数内部状态的指针
add.next(); // {value: 5, done: false}
add.next(); // {value: 10, done: false}
add.next(); // {value: 15, done: false}
add.next(); // {value: 20, done: false}
add.next(); // {value: 25, done: true}
生成器函数 yield 描述
根据语法规范,yield 关键字用来暂停和继续执行一个生成器函数。当外部调用生成器的 next() 方法时,yield 关键字右侧的表达式才会执行。
执行结果会转化为一个对象(包含两个属性, value 和 done),作为 next() 方法的返回值。
生成器函数 yield 理解
生成器函数类似服务器端语言的接口(Interface),生成器函数不可直接调用,必须赋值给为变量 或 赋值的变量通过 next() 调用执行 或 destructuring解构。
生成器函数执行过程分解:
首次执行到第一个 yield 返回结果并继续执行后续代码,但不会返回后续yield的值,生成器函数且储存之前变量及运算结果;
下次执行跳过上次 yield 结果返回最近一个 yield 结果... ...
... ... 依次执行直到没有 yield 或 有return为止。
function* fun(val) {
console.log("调用生成器函数");
yield console.log(1*val);
yield 2*val;
yield 3*val;
yield 4*val;
return 5*val;
}
var add = fun(5);
fun(5); // 不输出任何结果
function* fun(){
var a = 1;
var b = 2;
yield a;
[a, b] = [b, a + b];
yield a;
[a, b] = [b, a + b];
yield a;
[a, b] = [b, a + b];
yield a;
[a, b] = [b, a + b];
}
var [no1,no2,no3,no4] = fun();
console.log(no1); //
console.log(no2); //
console.log(no3); //
console.log(no4); //
注意 destructuring解构变量不可调用next(); 这个百度没查到为什么 不能调用next(),有大神知道为什么谢谢留言告诉下。
for... of ... 用法
function* fun(){
let a = 1,b = 2,c = 3;
yield a;
yield b;
yield c;
}
for(let i of fun()){
console.log(i); // 1 2 3
}
for…of循环可以自动遍历Generator函数时生成的Iterator对象。
ES6学习笔记目录
ES6学习笔记<一> let const class extends super
ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring
ES6学习笔记<四> default、rest、Multi-line Strings
ES6学习笔记<五> Module的操作——import、export、as
ES6学习笔记<三> 生成器函数与yield的更多相关文章
- Typescript 学习笔记三:函数
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- es6学习笔记10--箭头函数
基本用法 ES6允许使用“箭头”(=>)定义函数. var f = v => v; 上面的箭头函数等同于: var f = function(v) { return v; }; 如果箭头函 ...
- ES6学习笔记三:Symbol、Set、Map
一:Symbol ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值.它是 JavaScript 语言的第七种数据类型,前六种是:undefined.null.布尔值(Boolean). ...
- ES6学习笔记(三)——数值的扩展
看到这条条目录有没有感觉很枯燥,觉得自己的工作中还用不到它所以实在没有耐心看下去,我也是最近得闲,逼自己静下心来去学习去总结,只有在别人浮躁的时候你能静下心来去学去看去总结,你才能进步.毕竟作为前端不 ...
- python学习笔记三:函数及变量作用域
一.定义 def functionName([arg1,arg2,...]): code 二.示例 #!/usr/bin/python #coding:utf8 #coding=utf8 #encod ...
- ES6学习笔记三
1.Symbol ES5 的对象属性名都是字符串,这容易造成属性名的冲突.如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突.这就是 ES6 引入Symbol的原因 ...
- python 学习笔记三 (函数)
1.把函数视为对象 def factorial(n): '''return n!''' return 1 if n < 2 else n*factorial(n-1) print(factori ...
- ES6学习笔记三(proxy和reflect)
proxy用法 // 代理 { let obj={ time:'2017-03-11', name:'net', _r: }; let monitor=new Proxy(obj,{ // 拦截对象属 ...
- MySql学习笔记(三) —— 聚集函数的使用
1.AVG() 求平均数 select avg(prod_price) as avg_price from products; --返回商品价格的平均值 ; --返回生产商id为1003的商品价格平均 ...
随机推荐
- centos7上为什么不使用libcgroup进行资源限制
不使用libcgroup的原因 centos7上使用libcgroup进行资源限制可参考 https://blog.csdn.net/lanyang123456/article/details/814 ...
- Hanlp自然语言处理工具的使用演练
Hanlp是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用.Hanlp具备功能完善.性能高效.架构清洗.语料时新.可自定义的特点:提供词法分析(中文分词.磁性标注.命名实体识 ...
- CentOS7局域网下安装离线Ambari
1 Ambari介绍.安装与应用案例介绍 1.1 Ambari Ambari 跟 Hadoop 等开源软件一样,也是 Apache Software Foundation 中的一个项目,并且是顶级项目 ...
- window7环境MySql5.7 zip安装配置教程
1.将zip压缩包解压到一个目录下,并改名为mysql5.7 我的是放在D:\web\mysql5.7下 2.修改my-default.ini文件 下面几项是必填的,否则无法启动 basedir = ...
- 了解轮询、长轮询、长连接、websocket
业务开发中我们往往会有一些需要即时通信的场景,比如微信扫码登录.聊天功能. 下面这四种方式都可以实现即时通信. 轮询: 浏览器通过定时器每隔一段时间向服务器端发送请求,服务器端收到请求并响应请求.没有 ...
- Unable to load native-hadoop library for your platform... using builtin-java classes where applicable(四十四)
问题描述: Unable to load native-hadoop library for your platform... using builtin-java classes where app ...
- SSH加密原理、RSA非对称加密算法学习与理解
首先声明一下,这里所说的SSH,并不是Java传统的三大框架,而是一种建立在应用层和传输层基础上的安全外壳协议,熟悉Linux的朋友经常使 用到一 个SSH Secure Shell Cilent的工 ...
- 服务网关zuul之一:入门介绍
通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: 我们使用Spring Cloud Netflix中的Eureka实现了服务 ...
- Java学习——使用final修饰符
package Pack1; import java.awt.*; import java.applet.*; class ca { static int n = 20; final int nn; ...
- 怎么把PNG图的位深度24位变成32位
在PS里把图片的变成层模式,不透明度设置成99%,在保存成PNG