generator(生成器)是ES6标准引入的新的数据类型。


generator看上去像一个函数,但可以返回多次,除了return语句,还可以用yield返回多次。定义方式如下:
function* foo(x) {
yield x + 1;
yield x + 2;
return x + 3;
}
5
 
1
function* foo(x) { 
2
    yield x + 1;
3
    yield x + 2;
4
    return x + 3;
5
}

直接调用generator和调用函数不同,不会立刻执行,而是创建了generator对象。想要调用,有两种方法,接以上语法示例代码为例:

(1)不断使用generator对象的next()方法,会返回yield和return的值

var test = foo(3);
test.next(); // Object {value:4, done:false}
test.next(); // Object {value:5, done:false}
test.next(); // Object {value:6, done:true}
test.next(); // Object {value:undefined, done:true}
5
 
1
var test = foo(3);
2
test.next(); // Object {value:4, done:false}
3
test.next(); // Object {value:5, done:false}
4
test.next(); // Object {value:6, done:true}
5
test.next(); // Object {value:undefined, done:true}

next方法执行时每遇到yield会返回一个对象,包含返回的值,以及done属性,该属性表示generator是否执行结束。

(2)使用 for ... of 迭代generator对象,返回yield的值,不需要我们自己判断done

for(var x of foo(3)){
console.log(x);
}
//4, 5
 
1
for(var x of foo(3)){
2
  console.log(x);
3
}
4
//4, 5


02函数-05-generator(ES6)的更多相关文章

  1. ES6中的迭代器、Generator函数以及Generator函数的异步操作

    最近在写RN相关的东西,其中涉及到了redux-saga ,saga的实现原理就是ES6中的Generator函数,而Generator函数又和迭代器有着密不可分的关系.所以本篇博客先学习总结了ite ...

  2. JavaScript进阶系列02,函数作为参数以及在数组中的应用

    有时候,把函数作为参数可以让代码更简洁. var calculator = { calculate: function(x, y, fn) { return fn(x, y); } }; var su ...

  3. Python函数05/内置函数/闭包

    Python函数05/内置函数/闭包 目录 Python函数05/内置函数/闭包 内容大纲 1.内置函数(二) 2.匿名函数及内置函数(重要) 3.闭包 4.今日总结 5.今日练习 内容大纲 1.内置 ...

  4. Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global以及nolocal的用法

    Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global以及nolocal的用法 目录 Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global ...

  5. 02函数-04-箭头函数(ES6)

    ES6新增的函数:Arrow Function,定义方式就是一个箭头 箭头函数相当于匿名函数,并且简化了函数定义,和匿名函数最大的区别在于其内部的this不再"乱跑",而是由上下文 ...

  6. JavaScript箭头函数 和 generator

    箭头函数: 用箭头定义函数........           var fun = x=>x*x alert(fun(2))            //单参数   var fun1 = ()=& ...

  7. async函数对比Generator函数

    首先定义一个读取文件的异步函数 var readFile = function(fileName){ return new Promise((resolve,reject)=>{ fs.read ...

  8. Python 如何判断一个函数是generator函数?

    如何判断一个函数是否是一个特殊的 generator 函数?可以利用 isgeneratorfunction 判断: >>>from inspect import isgenerat ...

  9. JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)

    函数声明 JavaScript中声明函数的方式:(无需声明返回值类型) function add(i1, i2) {             return i1 + i2;//如果不写return返回 ...

随机推荐

  1. “margin塌陷” 嵌套盒子外边距合并现象

    来源于官方文档对于外边距合并的解释: 注释:只有普通文档流中块框的垂直外边距才会发生外边距合并.行内框.浮动框或绝对定位之间的外边距不会合并. 出现外边距塌陷的三种情况: 1.相邻兄弟元素之间 若两者 ...

  2. let、var、const声明的区别

    前言 看了方应杭老师的一篇解释let的文章,对JavaScript中的声明有了深刻的理解,这里也就有了总结一下JavaScript中各种声明之间区别的这篇文章. JavaScript中变量声明机制 首 ...

  3. js基础提高(二)

    JavaScript基础提高(二) 上篇写的是JavaScript的历史.基本的数据类型和基本的语法进填的话讲的就深入一些了. js的函数 1.js函数定义的方式 (1)普通方式 语法:functio ...

  4. Tomcat去除端口号和项目名(转)

    方法一: 在一个项目结束的时候,往往根据需要直接映射到一个IP地址上.此时就需要去除端口和项目名了,在访问的时候.下面根据具体的例子提供一种实现方法. 一.去掉项目名称 把<Context do ...

  5. DesignPatternPrinciple(设计模式原则)一

    设计模式六大原则(1):单一职责原则 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责.  问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需 ...

  6. 【可视化】Echarts3 在世界地图中绘制中国各省份的轮廓

    要在世界地图展现出来的情况下绘制中国省份的轮廓,根据现有的echarts-api是不可行的. 但好在echarts也提供了自定义地图的方式,使用echarts.registerMap();来实现 第一 ...

  7. DRAM(MT48LC8M32B2)学习

    Micron公司,型号为MT48LC8M32B2的DRAM,其86PIN的 TSOP封装引脚定义 Micron公司,型号为MT48LC8M32B2的DRAM,其86PIN的 TSOP封装引脚定义如上图 ...

  8. SpringMVC简单配置

    SpringMVC简单配置 一.eclipse安装Spring插件 打开help下的Install New Software 点击add,location中输入http://dist.springso ...

  9. Java入门(1) —— 变量、运算符、分支结构和程序员思维的理解

    1.计算机语言的发展史: 机器语言:机器语言是指一台计算机全部的指令集合. 汇编语言:为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母.符号串来替代一个特定的指令的二进制 ...

  10. 迈向angularjs2系列(7):表单

    目录 一:校验表单的使用 1.搭建脚手架 2.校验表单的使用 3.select下拉列表的用法 一: 校验表单的使用 对于CRUD型的应用,表单是必备组件. 1.搭建脚手架 git clone http ...