解析 ES6 中 yieId 与 Generator
yieId :yield是 ES6 的新关键字,使生成器函数执行暂停
Generator:(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次。定义方式与 function 类似,在名称前面加一个 * ,如下,就是一个生成器的定义:
function* fibs() {
}
代码解析:
function* fibs() {
let a = 0;
let b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
let [first, second, third, fourth, fifth, sixth] = fibs();
给 first 赋值时,调用 fibs ,遇到 yieId 时暂停,所以此时 a = 0,b=1,first = 0;
给 second 赋值时,继续调用 fibs ,从上次暂停的地方开始,a = b = 1,b = a + b = 0+1 = 1, second = a = 1;
给 third 赋值,继续调用 fibs,从上次暂停地方开始,a = b = 1, b = a + b = 1 + 1 = 2 ,third = a = 1;
给 fourth 赋值,继续调用 fibs,从上次暂 停地方开始,a = b = 2 , b = a + b = 1 + 2 = 3 , fourth = a = 2 ;
给 fifth 赋值,继续调用 fibs,从上次暂停地方开始, a = b = 3,b = a + b = 2 + 3 = 5, fifth = a = 3;
给 sixth 赋值,继续调用 fibs,从上次暂停地方开始, a = b = 5, b = a + b = 3 + 5 = 8 , sixth = a = 5;
以上,通过对一段最简单代码的详细解释,就可以知道 yieId 与 Generator 的用法,不过这不是在项目中的常规用法,读懂它只是为了方便理解概念,下面再解析在日常用法:
var foo = function *() {
var x = 1;
var y = yield (x + 1);
var z = yield (x + y);
return z;
}()
var a = foo.next();
var b = foo.next(3);
var c = foo.next(5);
我们经常是在定义好生成器之后,通过 next() 驱动来调用它,next 中的参数代表上一次执行完毕后的 yieId 的值,所以第一次调用时不需要给 next 传入参数,返回值包括 {value,done},value 代表当前值,done 标记当前生成器是否执行完毕。
console.log(a) //{ value: 2, done: false }
//y = x + 1 = 2,之后遇到 yieId 生成器暂停,方法没有执行完 done = false
console.log(b) //{ value: 4, done: false }
// z = x + y = 1 + 3 = 4,其中 y 是上一次的 yieId 最后寄存值,传入值是 3,意味着 yieId (x+1) = 3,遇到 yieId 暂停,方法没有执行完,所以 done = false
console.log(c) //{ value: 4, done: true }
// z = 5,其中 5 是传输的参数值,程序遇到 return 执行完毕,所以 done = true