美文网首页
Javascript中Generator(生成器函数)浅析

Javascript中Generator(生成器函数)浅析

作者: 酱ka油 | 来源:发表于2018-01-15 15:19 被阅读0次

1.什么是生成器

生成器是一个函数,可以用来生成迭代器
生成器函数和普通函数不一样,普通函数是一旦调用一定会执行完
但是生成器函数中间可以暂停,可以执行一会歇一会
生成器函数有一个特点,需要加*

2.生成器有若干个阶段,如何划分这些阶段呢?

function *go(a){
  console.log(1);
  //此处的b用来供外界输入进来的
  //这一行实现输入和输出,本次的输出放在yield后面,下次的输入放在yield前面
  let b =  yield a;
  console.log(2);
  let c = yield b;
  console.log(3);
  return c;
}
//生成器函数和普通的函数不一样,调用它的话函数并不会立刻执行
//它会返回此生成器的迭代器,迭代器是一个对象,每调用一次next就可以返回一个值对象
let it = go("a值");
console.log(it);//{}
//next第一次执行不需要参数,传参数没有意义
let r1 = it.next();
////第一次调用next会返回一个对象,此对象有两个属性,一个是value就是yield后面那个值,一个是done表示是否迭代完成
console.log(r1);//{ value: 'a值', done: false }
let r2 = it.next('B值');
console.log(r2);//{ value: 'B值', done: false }
let r3 = it.next('C值');
console.log(r3);//{ value: 'C值', done: true }

每当调用生成器对象的.next()方法时,函数恢复运行直至遇到下一个yield表达式,其作用是用于迭代。因此it.next()的目的是为了返回不同的字符串。在最后的it.next()中,使用done:true表示结束。到达函数末端意味着返回的结果是undefined,所以代码片段中使用value: undefined结尾。

3.生成器的return的值不会被for...of循环到,也不会被扩展符遍历到

function *gen(){
    yield 0;
    yield 1;
    return 2;
    yield 3;
};
let g=gen();
console.log([...g]);//[ 0, 1 ] return 2和yield 3没有生效

4.在一个生成器函数里面调用另外一个生成器函数

function *foo(){
    yield 0;
    yield 2;
}
function *go(){
    yield "x";
    yield *foo();
    yield "y";
}
let g=go();
console.log([...g]);//[ 'x', 0, 2, 'y' ]

5.模拟下next()返回值结构是

{
    value:"value",//value为返回的值
    done:false//done的值为一个布尔值,如果迭代器未遍历完毕,它就返回false,否则返回true
}
function gen(arry){
    var nextIndex=0;
    return {
        next:function(){
            return nextIndex<arry.length?{value:arry[nextIndex++],done:false}:{value:undefined,done:true};
        }
    }
}
let arr=["1", "2", "3", "4"];
let it = gen(arr);
console.log(it.next());//{ value: '1', done: false }
console.log(it.next());//{ value: '2', done: false }
console.log(it.next());//{ value: '3', done: false }
console.log(it.next());//{ value: '4', done: false }
console.log(it.next());//{ value: undefined, done: true }

6.next()方法传参数:

function* foo(x) {
    let a = 2 * (yield(x + 1));
    let b = yield(a / 3);
    return (x + a + b);
}
//没传参的情况
var it=foo(5);
console.log(it.next());//{ value: 6, done: false }
console.log(it.next());//{ value: NaN, done: false }
console.log(it.next());//{ value: NaN, done: true }
//传参数的情况:
var it1=foo(5);
//第一次next传参没意义
console.log(it1.next());//{ value: 6, done: false }
console.log(it1.next(6));//{ value: 2, done: false }
console.log(it1.next(7));//{ value: 24, done: true }

7.try catch throw

function *go(){
    
    try{
        yield;
    }catch(e){
        console.log("err",e)
    }
}
let it=go();
it.next();
try{
    it.throw("出错了");
}catch(e){
    console.log("外部捕获",e)
}
//输出的结果是:"err 出错了"

相关文章

  • Javascript中Generator(生成器函数)浅析

    1.什么是生成器 生成器是一个函数,可以用来生成迭代器生成器函数和普通函数不一样,普通函数是一旦调用一定会执行完但...

  • Promise/generator/async与await

    promise generator 函数 (生成器函数); 普通函数function show(){} 生成器函数...

  • Generator函数实现斐波那契数列

    ES6 中 generator生成器函数 特点: 调用generator函数返回一个迭代器(iterator)对象...

  • Generator异步方案、AsyncAwait语法糖

    生成器函数(Generator) generator是一个函数,有两个特征:generator由function*...

  • Generator

    Generator 概念: Generator 函数返回的遍历器对象 基本用法 // 定义生成器函数 ...

  • 生成器

    生成器 在python中,使用了yield的函数被称为生成器(generator)。生成器是一个返回迭代器的函数,...

  • 8-1、generator yield

    generator 生成器generator 函数 中间可以暂停(普通函数一路走到黑)*fun 加 *next()...

  • Generator

    生成器函数(Generator Function) 生成器函数不能直接作为函数来使用 执行生成器函数会返回一个生成...

  • Python yield的使用

    带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? ...

  • async await 的实现原理

    generator + yield + promise 利用generator遍历器生成器函数的分段执行 ,只有在...

网友评论

      本文标题:Javascript中Generator(生成器函数)浅析

      本文链接:https://www.haomeiwen.com/subject/ayfdoxtx.html