ES6-Generator函数

Generator函数

执行Generator函数会返回一个遍历器函数。返回的遍历器函数,可以依次遍历Generator函数内部的每一个状态。

形式上,Generator函数是一个普通函数,有两个特征。一:function关键字与函数名之间有一个*;二:函数体内部使用yield语句,定义不同的内部状态。

/**

 * test函数内部有三个状态,helloworldreturn(结束执行)

 * 调用该函数后,该函数并不执行,返回的也不是函数的运行结果,而是一个指向内部状态的指针对象。(Iterator遍历器对象)必须调用遍历器对象打的next方法,使得指针移向下一个状态。

 * hw每次调用next方法,内部指针就从函数头部或上一次停下来的地方开始执行,直到遇到下一个yield语句(或者return语句)。

 * Generator函数是分段执行的,yield语句是暂停执行的标记,而next方法可以恢复执行。

 */

function*test(){

  yield 'hello'

  yield 'world'

  return 'test'

}

let hw = test()

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

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

console.log(hw.next());//{ value: 'test', done: true }

yield语句

由于Generator函数返回的是遍历器对象,只有调用next方法才会遍历下一个内部状态,所以其实提高了一种可以暂停执行的函数。yield语句就是暂停标志。

注意:如果函数没有return语句,则返回的对象的value的值为undefined。

yield语句与return语句的异同

相似:都能返回紧跟在语句后面的那个表达式的值。

区别:

每次遇到yield,函数暂停执行,下一次从该位置继续往后执行。

return语句不具备位置记忆功能,一个函数里面只能执行一次return语句,但是可以执行多个yield。

正常函数只能返回一个值,因为只能执行一次return。

Generator函数可以返回一系列的值,因为可以有多个yield。

与Iterator接口的关系

任意一个对象的Symbol.iterator方法,等于该对象的遍历器生成函数,调用该函数会返回该对象的一个遍历器对象。

next方法的参数

yield表达式本身没有返回值,或者说总是返回undefined,next方法可以带一个参数,该参数会被当作上一个yield表达式的返回值。next()方法的返回值为一个对象,表示当前阶段的信息(value属性和done属性),value是yield语句后面的表达式的值,

function* foo(x) {

  var y = 2 * (yield (x + 1));

  var z = yield (y / 3);

  return (x + y + z);

}

 

var a = foo(5);

a.next() // Object{value:6, done:false}

a.next() // Object{value:NaN, done:false}

a.next() // Object{value:NaN, done:true}

/**

 * 第二次运行next方法的时候不带参数,导致y的值为2*undefinedNaN

 * 第三次运行next方法,zundefined返回的对象属性为5+NaN+NaNNaN

 */

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值