为什么要把这个内容拿出来单独做一篇学习笔记?

  生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数。

标题为什么是生成器函数与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学习笔记<三> 生成器函数与yield

ES6学习笔记<四> default、rest、Multi-line Strings

ES6学习笔记<五> Module的操作——import、export、as

ES6学习笔记<三> 生成器函数与yield的更多相关文章

  1. Typescript 学习笔记三:函数

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  2. es6学习笔记10--箭头函数

    基本用法 ES6允许使用“箭头”(=>)定义函数. var f = v => v; 上面的箭头函数等同于: var f = function(v) { return v; }; 如果箭头函 ...

  3. ES6学习笔记三:Symbol、Set、Map

    一:Symbol ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值.它是 JavaScript 语言的第七种数据类型,前六种是:undefined.null.布尔值(Boolean). ...

  4. ES6学习笔记(三)——数值的扩展

    看到这条条目录有没有感觉很枯燥,觉得自己的工作中还用不到它所以实在没有耐心看下去,我也是最近得闲,逼自己静下心来去学习去总结,只有在别人浮躁的时候你能静下心来去学去看去总结,你才能进步.毕竟作为前端不 ...

  5. python学习笔记三:函数及变量作用域

    一.定义 def functionName([arg1,arg2,...]): code 二.示例 #!/usr/bin/python #coding:utf8 #coding=utf8 #encod ...

  6. ES6学习笔记三

    1.Symbol ES5 的对象属性名都是字符串,这容易造成属性名的冲突.如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突.这就是 ES6 引入Symbol的原因 ...

  7. python 学习笔记三 (函数)

    1.把函数视为对象 def factorial(n): '''return n!''' return 1 if n < 2 else n*factorial(n-1) print(factori ...

  8. ES6学习笔记三(proxy和reflect)

    proxy用法 // 代理 { let obj={ time:'2017-03-11', name:'net', _r: }; let monitor=new Proxy(obj,{ // 拦截对象属 ...

  9. MySql学习笔记(三) —— 聚集函数的使用

    1.AVG() 求平均数 select avg(prod_price) as avg_price from products; --返回商品价格的平均值 ; --返回生产商id为1003的商品价格平均 ...

随机推荐

  1. 转JMeter ----数据库 not allowed to connect to this MySQL

    测试的时候遇到报错:   Cannot create PoolableConnectionFactory (null,  message from server: "Host 'ceshiP ...

  2. Linux shell 将字符串分割成数组

    原文链接:http://1985wanggang.blog.163.com/blog/static/776383320121745626320/ a="one,two,three,four& ...

  3. 使用Vivado进行行为级仿真

    使用Vivado进行行为级仿真 1.编写设计文件 module test( input in, output out ); assign out = ~in; endmodule 2.编写testbe ...

  4. 【转】用python比对数据库表数据的脚本

    最近在做一个数据库异构复制的项目,客户表示需要一个数据比对的工具,我就自己写了一个异构数据库的比对python脚本.这个比对脚本只能比对数量,不能比对具体的记录.使用的sql语句也是最基础的selec ...

  5. console call的fallback console 兼容

    (function() { var noop = function noop() {}; var methods = [ 'assert', 'clear', 'count', 'debug', 'd ...

  6. Random 中的种子怎么理解

    种子就是生成随机数的根,就是产生随机数的基础.计算机的随机数都是伪随机数,以一个真随机数(种子)作为初始条件,然后用一定的算法不停迭代产生随机数.Java项目中通常是通过Math.random方法和R ...

  7. Intellij Idea编译项目下的.java文件时的编码问题

    Intellij Idea编译项目下的.java文件时的编码问题 原创 2015年07月22日 21:45:14 10510 由<编译.java文件时的编码问题>可知,在编译.java文件 ...

  8. Python单元测试框架之pytest 4 -- 断言

    From: https://www.cnblogs.com/fnng/p/4774676.html Python单元测试框架之pytest -- 断言 2015-08-31 23:57 by 虫师, ...

  9. css-去掉IE浏览器自带×号

    1.去除IE输入框的叉号 /* 去除IE输入框的叉号 */ ::-ms-clear, ::-ms-reveal{ display:none; } 2.前端多行展现代码,多余部分使用...代替 div{ ...

  10. 学习笔记之pandas Foundations | DataCamp

    pandas Foundations | DataCamp https://www.datacamp.com/courses/pandas-foundations Many real-world da ...