es6入门(六):Generator
来源:互联网 发布:2016年制造业数据 编辑:程序博客网 时间:2024/06/11 06:56
Generator是一种异步编程的解决方案,语法与传统的语法存在一定的不同。
与一般函数的区别在与:
(1)、function 与函数名之间有一个星号(*)存在,尽管es6 没有规定星号(*)是紧挨着function 还是紧挨着函数名,推荐星号(*)紧挨着function;
(2)、在函数体内部有yield表达式。yield是暂停标志。
(3)、Generator函数的调用也是函数名+();但是与普通的函数和有一点区别是该函数不会立即执行,也不会返回函数运行的结果,而是返回一个指向内部状态的指针对象。即遍历器对象。只有调用next()方法时,才会改变指针的指向,指向下一个状态。
介绍一下Generator函数是如何运行的?
function* helloGenerator(){ yield 'hello'; yield 'es6';return 'stop'; }var hg = helloGenerator();hg.next()//=>'hello' false;hg.next()//=>'es6' false;hg.next();/=>'stop' true;hg.next()//=>'undefined' true
一共调用了四次next(),最后一次是返回的value是undefined,done是true,只要以后每次调用next,都是返回这两个值。则表示循环遍历结束。
总结:调用 Generator 函数,返回一个遍历器对象,代表 Generator 函数的内部指针。以后,每次调用遍历器对象的next
方法,就会返回一个有着value
和done
两个属性的对象。value
属性表示当前的内部状态的值,是yield
表达式后面那个表达式的值;done
属性是一个布尔值,表示是否遍历结束。
上面已经介绍了说yield是暂停标志,下面对yield进行一些介绍:
(1)、yield后面的表达式只有当调用next时,才会执行yield后面的表达式。
(2)、yield表达式只能写在Generator函数中 ,而不能写在普通的函数中。
(3)、yield表达式如果与其他表达式相结合,必须写在()里面。
yield与return的异同点:
相同点:都可以返回紧跟后面表达式的值
不同点:(a)、在一个函数内部只能存在一个return语句,而可以存在多个yield语句;(b)、return没有记忆功能,在Generator函数中只有当遍历器对象调用next是才会返回yield后面表达式的值,当下一次调用时从上一条yield语句后开始执行,而return后面的表达式只要函数执行就立即返回。(c)、正常函数只有一个返回值,而Generator函数可以有多个返回值。
Generator函数被执行时,返回的是指向函数内部的遍历器对象,只有调用遍历器对象的next方法时,才会返回yield后面函数表达式的值,但是,其实yield表达式的值一直都是undefined。如果在Generator的函数中传递参数且存在多个yield表达式时,那么调用next方法时就要注意传参了:next()中传递的参数就是上一个yield表达式的返回值。
function* helloGenerator(x){var y = 2*(yield(x+1));var z = yield(y/3);return (x+y+z);}var foo = helloGenerator(5);foo.next();//6foo.next();//NaNfoo.next();//NaNvar foo = helloGenerator(5);foo.next();//6foo.next(9);//3foo.next(10);//33使用for...of时就可以不用调用遍历器对象的next方法就可以遍历Generator函数内部的yiled表达式的值;但是当done的值为true时,该返回值是不会被遍历的。
function* helloGenerator(){yield 1;yield 2;yield 3;yield 4;yield 5;return 6;}for(let i of helloGenerator()){console.log(i);}//=>1 2 3 4 5
- es6入门(六):Generator
- ES6--Generator
- ES6-generator
- 【es6】Generator
- ES6 Generator
- ES6 Generator
- ES6新特性:Generator以及衍生NPM库CO入门
- ES6 Generator函数
- es6的Generator函数
- ES6 Generator介绍
- es6的generator
- 深入解析 ES6:Generator
- ES6中的Generator函数
- 12、ES6 之Generator
- es6 Generator (十五)
- 【ES6】Iterator和Generator
- ES6学习笔记:Generator
- ES6——Generator
- chrome浏览器扩展postman安装使用
- 自学成才的黑客(安全研究员)是从哪学到那些知识的?(跳转知乎)
- Androidbby
- 多线程处理读写数据库,脏数据梳理
- GKRandomSource
- es6入门(六):Generator
- 如何转载博客
- Springboot对数据库简单的增删(-)查
- k-means聚类算法hadoop实现源码
- 指导Agent在XX的环境中做出最优决策的模型框架
- Android dialog自定义样式的弹窗
- Cycript
- Android 的 Application 初始化
- 【模板】区间修改-线段树