ES6学习-Generator函数的语法

说明:本文参考阮一峰的ECMAScript 6 入门

1.简介

基本概念
Generator函数是ES6提供的一种异步编程解决方案。语法行为与传统函数完全不同。
在语法上,可以把Generator函数理解为一个状态机,封装了多个内部状态。
执行Generator函数会返回一个遍历器对象,可以依次遍历Generator函数内部的每一个状态。
形式上,Generator函数是一个普通函数,但是有两个特征。一是function关键字和函数名之间有一个星号(*),二是函数内部使用yield表达式定义内部不同状态。

function* helloWorldGenerator () {
	yield 'hello';
	yield 'world';
	return ending;
}
var hw = helloWorldGenerator();

上面代码。定义了一个helloWorldGenerator函数,内部yield定义了两种状态(hello和world),再加上return(结束时执行)就是三种状态。
从上面代码,你也可以看到,Generator函数的调用方法与普通函数的调用方法一样,在函数名后面添加圆括号,但调用Generator函数之后,函数不会执行,返回的也不是函数的运行结果,返回的是一个指向内部状态的指针对象,即遍历器对象(Iterator)。
下一步,必须调用next()方法,才能让指针指向下一个状态。也就是说,每次调用next()方法,就可以让函数指针从内部头部或上一次所在地方开始执行,直到开始遇到下一个yield表达式或return 语句为止。

hw.next()
// { value: 'hello', done: false }

hw.next()
// { value: 'world', done: false }

hw.next()
// { value: 'ending', done: true }

hw.next()
// { value: undefined, done: true }

上面代码一共调用了四次next方法。

第一次调用next()方法,Generator函数开始执行,一直到第一个yeild表达式为止。next方法返回的是一个对象,对象的value属性值是当前yeild表达式的值hello,done属性的值是false,表示遍历还没有结束。

第二次调用next()方法,Generator函数从上一次停下的yeild表达式处开始执行,直到下一个yeild表达式为止。next方法返回的是一个对象,对象的value属性值是当前yeild表达式的值world,属性done值为false,表示遍历还没有结束。

第三次调用next()方法,Generator函数从上一次停下的yeild表达式处开始执行,直到return表达式处为止。next方法返回的是一个对象,对象的value属性值为紧跟在return后面的表达式的值ending(如果没有return语句,则value属性的值为undefined),done属性的值为true,表示遍历已经结束。

第四次调用next()方法,此时Generator函数已经运行结束,next方法返回的对象的value属性值为undefined,done属性值为true。以后再调用next方法,返回的都是这个值。

总结一下,调用Generator函数,返回一个遍历器对象,代表Generator函数的内部指针。以后,每次调用遍历器对象的next方法都会返回一个具有value属性和done属性的对象。value属性代表当前的内部状态值,是yeild表达式后面的那个值;yeild属性是一个布尔值,表示遍历是否结束。

ES6 没有规定,function关键字与函数名之间的星号,写在哪个位置。这导致下面的写法都能通过。

function * foo(x, y) { ··· }
function *foo(x, y) { ··· }
function* foo(x, y) { ··· }
function*foo(x, y) { ··· }

由于 Generator 函数仍然是普通函数,所以一般的写法是上面的第三种,即星号紧跟在function关键字后面。本书也采用这种写法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值