前端是万能的让前端飞前端开发

解析 ES6 中 yieId 与 Generator

2019-05-05  本文已影响3人  肆意木

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
上一篇 下一篇

猜你喜欢

热点阅读