ES6新特性之生成器函数 (generator function): function*
一、什么是生成器函数?
生成器函数是ES6的新特性之一,它是一个在执行时能中途暂时退出,后面重新调用又能重新进入继续执行的一种函数。
并且在函数内定义的变量的所有状态不受中途退出的影响。
二、语法
声明方式:
function* 函数名([参数1[, 参数2[, ... 参数n]]]) { JS语句 }
调用说明:
1) 调用生成器对象时会返回一个生成器的迭代器
2) 该迭代器中有一个next()方法,它返回一个包含value和done的对象
3) 每次调用next()方法遇到yied表达式位置暂停执行
4) value表示yied表达式的返回值,done表示该生成器最后一个值是否已经产生
5)如果给next()方法传递参数, 参数的值会代替yied表达式的返回值
6) 如果在生成器中调用return,生成器将提前完成
三、示例
1、定义一个自增生成器函数,每次next()调用返回自增的值

输出如下:
>1 false
>2 false
>3 false
>4 false //想想为什么是false?
>undefined true
我们做了什么事:
1) 声明一个生成器函数increment(n),每次判断小于n时自增
2) 每次自增用yield表达式,返回表达式的值,然后自增(因为是后缀++)
function* increment(n){
var index = 1;
while(index<n)
yield index++;
}
3) 调用生成器函数,返回一个迭代器对象,赋给变量it
var it = increment(5);
4) for循环遍历
//为什么要多声明一个temp变量?
for(let i = 0; i<5; i++)
{
let temp = it.next();
console.log(temp.value);
console.log(temp.done);
}
直接使用it.next()
for(let i = 0; i<5; i++)
{
console.log(it.next().value);
console.log(it.next().done);
} //输出为:1, false, 3, false, undefined, true, undefined, true, undefined, true
2、给next()传递参数
function* increment(){
let index = 1;
console.log(yield index++);
console.log(yield index++);
console.log(yield index++);
}
var it = increment();
it.next();
it.next(3);
it.next(9);
输出为:3,9
3、显式返回
function* increment(){
let index = 1;
yield index++;
return "complete";
yield index++;
yield index++;
}
var it = increment();
console.log(it.next().value); { value: 1, done: false }
console.log(it.next().value); { value: "complete", done: true }
console.log(it.next().value); { value: undefined, done: true }
四、补充
yield*
语法:
yield* [[表达式]]
说明:
yield* expression 用于委托给另一个generator或可迭代对象。
栗子:
function* increment_slowly(){
let index = 1.1;
yield index = 1.2;
yield index += 0.11;
}
function* increment(){
let index = 1;
yield index++;
yield* increment_slowly();
yield index++;
}
var it = increment();
console.log(it.next().value); // >1
console.log(it.next().value); // >1.2
console.log(it.next().value); // >1.31
console.log(it.next().value); // >2
题外话:这个排版有点丑,打算去看看博客园怎么排版,下一篇文章做做排版,更加清晰地显示。
ES6新特性之生成器函数 (generator function): function*的更多相关文章
- 轻松学会ES6新特性之生成器
生成器虽然是ES6最具魔性的新特性,但也是最难懂得的一节,笔者写了大量的实例来具体化这种抽象的概念,能够让人一看就懂,目的是希望别人不要重复或者减少笔者学习生成器的痛苦经历. 在说具体的ES6生成器之 ...
- ES6新特性:Javascript中Generator(生成器)
ES6的很多特性都跟Generator扯上关系,而且实际用处比较广, 包含了任何需要异步的模块, 比如ajax, filesystem, 或者数组对象遍历等都可以用到: Generator的使用: G ...
- ES6新特性之箭头函数与function的区别
写法不同 // function的写法 function fn(a, b){ return a+b; } // 箭头函数的写法 let foo = (a, b) =>{ return a + b ...
- ES6新特性3:函数的扩展
本文摘自ECMAScript6入门,转载请注明出处. 一.函数参数默认值 1. ES6允许为函数的参数设置默认值,即直接写在参数定义的后面. function log(x, y = 'World') ...
- es6新特性之箭头函数
<script> { // es3,es5 var evens = [1, 2, 3, 4, 5]; var odds = evens.map(function (v) { return ...
- ES6新特性三: Generator(生成器)函数详解
本文实例讲述了ES6新特性三: Generator(生成器)函数.分享给大家供大家参考,具体如下: 1. 简介 ① 理解:可以把它理解成一个函数的内部状态的遍历器,每调用一次,函数的内部状态发生一次改 ...
- ES6生成器函数generator
ES6生成器函数generator generator是ES6新增的一个特殊函数,通过 function* 声明,函数体内通过 yield 来指明函数的暂停点,该函数返回一个迭代器,并且函数执行到 y ...
- ES6新特性(函数默认参数,箭头函数)
ES6新特性之 函数参数的默认值写法 和 箭头函数. 1.函数参数的默认值 ES5中不能直接为函数的参数指定默认值,只能通过以下的变通方式: 从上面的代码可以看出存在一个问题,当传入的参数为0或者 ...
- ES6新特性简介
ES6新特性简介 环境安装 npm install -g babel npm install -g babel-node //提供基于node的REPL环境 //创建 .babelrc 文件 {&qu ...
随机推荐
- Example001使用window对象打开窗口
<!--实例001使用window对象打开窗口--> <script> <!--使用window对象打开窗口的语法格式如下--> <!--window.ope ...
- 解决ubuntu不能安装g++的问题
下面提供一种解决方法,解决方法不唯一 首先贴出错误原因: 上文是g++-4.8不能下载,所以退而求其次,指定版本4.7,不下载最新的 解决方法如下: 安装成功后而已查看版本信息确认 使用g++-4.7 ...
- Cornerstone.js使用相关
官网地址:https://github.com/chafey/cornerstone 简介: Cornerstone is an open source project with a goal to ...
- 使用Gulp实现前端构建自动化
使用Gulp实现前端构建自动化 安装 一.安装NodeJs Gulp的安装依赖于NodeJs的npm安装管理器 安装包下载地址 关于npm命令: 1. npm install <name> ...
- 新闻信息的javaBean
//新闻信息的javaBeanpublic class News { //新闻属性 private int id; //id private int categoryId ;//新闻类别id priv ...
- Java编程练习(四)——集合框架应用
Java集合框架小应用之扑克牌小游戏 学习了Java集合框架之后,我写了一个扑克牌小游戏来巩固知识.学习之余的练习之作,有不足之处还得多多指教了~(*/ω\*) 扑克牌小游戏背景: 1. 创建一副扑克 ...
- Sublime Text中安装插件来实现px与rem间的换算
今天在群里无意中看到了群友分享的一篇关于移动端的文章.里面其他内容我倒不大感兴趣,反而是rem让我提起了兴趣. 首先来谈一下rem,rem是CSS3中新增加的一个单位值,它和em单位一样,都是一个相对 ...
- json和xml封装数据、数据缓存到文件中
一.APP的通信格式之xml xml:扩展标记语言,可以用来标记数据,定义数据类型,是一种允许用户对自己标记语言进行定义的源语言.XML格式统一,扩平台语言,非常适合数据传输和通信,业界公认的标准. ...
- HDU 1864 最大报销额(DP)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1864 题目: 最大报销额 Time Limit: 1000/1000 MS (Java/Others) ...
- AllPairs运用遇到的问题及解决办法分享
前些天用AllPairs自动生成了交互式测试用例,中间遇到的问题困扰了一天,最后解决了.现在分享下解决过程 首先,D\AllPairs是我的ALLPairs安装目录,C盘桌面test.txt是我写的测 ...