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

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

标题为什么是生成器函数与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. mycat配置安装测试

    https://www.jianshu.com/p/26513f428ecf #下载安装#java jdk mkdir /usr/local/java/tar -zxvf jdk-7u80-linux ...

  2. JavaWeb工程 目录结构***

    以下是mavaen推荐的项目目录. ├── pom.xml └── src     ├── main     │   ├── java     │   │   └── group     │   │  ...

  3. dubbo-admin在jdk8下不兼容

    参考这里 修改pom.xml webx的依赖改为3..6版 <dependency> <groupId>com.alibaba.citrus</groupId> & ...

  4. PL/SQL Developer 使用小技巧

    1.PL/SQL Developer记住登陆密码 在使用PL/SQL Developer时,为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码: 设置方法:tools- ...

  5. C++11--右值引用(Perfect Forwarding)

    /* * 右值引用 2: Perfect Forwarding */ void foo( boVector arg ); // boVector既有移动构造又有拷贝构造 template< ty ...

  6. Memcached 集群架构方面的问题 [z]

    集群架构方面的问题       memcached是怎么工作的? Memcached的神奇来自两阶段哈希(two-stage hash).Memcached就像一个巨大的.存储了很多<key,v ...

  7. Console.WriteLine的小用法

    我在一开始使用Console.WriteLine的时候,经常采用的是拼接字符串的形式来构建输出. 但是Console.WriteLine具有扩展的方法来对内容进行输出,类似于我们常用的String.F ...

  8. linux下配置java环境

    1.首先要去下载好JDK Java SE 8的官方网址是http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2 ...

  9. redis(redis概念,运用场景,如何操作基本数据类型)

    什么是redis:Nosql一种缓存数据库 redis可以干什么:redis可以减轻对数据库的请求压力如果不使用缓存:客服端->控制层->业务层->dao层使用缓存:客服端-> ...

  10. eclipse安装、汉化、搭建安卓开发环境

    1.eclipse与jdk的位数(32bit or 64bit )要对应,否则会提示Failed to load JNI shared library.提示这一种错误据说还有另外一种原因就是Path路 ...