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方法,就会返回一个有着valuedone两个属性的对象。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();//NaN
var 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 



原创粉丝点击