generator函数

语法规则:
  • 以function* funname形式申明函数
  • 函数体内使用yield关键字中断程序向下执行,被yield修饰的表达式的值会被记录下来
  • 执行funname函数会返回一个可遍历的对象
  • 调用对象的next()方法,才会驱动这个函数执行,并且返回yield修饰的表达式的值
  • next()方法返回值是一个对象{value: '', done: false},当done为true即表示函数执行完毕了。
1.generator函数我把它理解为可停止的函数
function* stopFun(){
	let x = 1;
	console.log(1)
	yield x = x+1;
	console.log(2);
}

------------------------------------
let it = stopFun();
console.log(it.next());

控制台打印如下:
1
{value:2,done:false}
------------------------------------
------------------------------------
let it = stopFun();
console.log(it.next());
console.log(it.next());

控制台打印如下:
1
{value:2,done:false}
2
{value: undefined, done: true}
------------------------------------

总结:

  • 当执行next方法即在函数中寻找yield,如果找到yield则将yield的值返回,且原函数执行停止
  • 再次调用next会继续执行yield之后的程序,若没找到yield,则函数直接执行完毕,返回done:true
  • 如果函数有return,则value返回return的值,没有则返回undefined

老驴拉新磨,磨转豆产粉...

2.next()方法带参使用
如果把yield比作存档,next()就是读取存档,继续游戏,最关键的在于,在继续游戏前,他能修改存档的数据
function* changeFun(a){
	console.log(a);
	let b = yield (a+1);
	console.log(b);
	let c = b*2;
	console.log(c);
}
------------------------------------
let it = changeFun(1);
console.log(it.next());
console.log(it.next());

控制台打印如下:
1
{value: 2, done: false}
undefined
NaN
{value: undefined, done: true}
------------------------------------
------------------------------------
let it = changeFun(1);
console.log(it.next());
console.log(it.next(2));

控制台打印如下:
1
{value: 2, done: false}
2
4
{value: undefined, done: true}
------------------------------------

总结

  • 第一次调用next()开始执行程序,当遇到yield,停止运行,返回表达式(a+1)的值,
  • 第二次调用next(),从上一个yield停止的位置继续执行,若没有传参,表示yield(a+1)没有值,b打印出来的是undefined
  • 如果传参2,则b = yield(a+1)就有值了。说明next传参,参数的值是整个yield表达式的值。
3.generator函数可以强制中断结束程序。

如果这一局游戏不想玩了,玩家是可以直接return的,强制退出,注意:是强制退出,后面的都不用走了!

function* returnTest(){
	console.log(1);
	yield x = "游戏存档";
	console.log(2);
	return "game over!"
}
------------------------------------
let it = returnTest();
console.log(it.next());
console.log(it.return());
console.log(it.next());

控制台打印如下:
1
{value: "游戏存档", done: false}
{value: undefined, done: true}
{value: undefined, done: true}
------------------------------------
4.for of循环语句可以遍历generator函数的调用对象
function* recycleFun(){
	yield a = "1";
	yield "2";
	yield "3";
	yield "over";
}

------------------------------------
let it = recycleFun();
for(let value of it){
  console.log(value)
}

控制台打印如下:
1
2
3
over
------------------------------------


实战篇

转载于:https://my.oschina.net/u/2425353/blog/3081726

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值