语法规则:
- 以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
------------------------------------