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}
------------------------------------

总结:java

  • 当执行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}
------------------------------------

总结code

  • 第一次调用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
------------------------------------


实战篇

相关文章
相关标签/搜索