js生成器的理解

103 阅读1分钟

生成器:可以在一个函数块内暂停和恢复代码执行的能力,可以在函数名称前加一个星号来表示其为生成器(注意:箭头函数不能用来定义生成器函数) 调用生成器函数会产生一个生成器对象,该对象最开始是处于暂停执行的状态的(suspended),它有一个next方法可以让生成器开始或者恢复执行:

   function*generatorFn(){}
   const g = generatorFn();
   console.log(g);//generatorFn{<suspended>}
   console.log(g.next);//f next () {[native code]}

next方法:这个方法的返回值有一个done属性和一个value属性,函数体为空的生成器函数调用一次next()就会让生成器到达done:true的状态。value属性是生成器函数的返回值,默认值是undefined。 前面说了最开始调用生成器函数是产生一个生成器对象,它只有在初次调用next()方法后才会开始执行:

    function*generatorFn(){
        console.log('foobar');
    }
    let generatorObj = generatorFn();//初次调用不会打印日志
    generatorObj.next();//foobar

yield关键字:让生成器停止和开始执行。生成器函数在遇到该关键词之前正常执行,遇到之后执行停止,只能通过调用next()方法恢复执行。当使用yield实现输入和输出的时候要注意第一次调用next()传入的值不会被使用,因为这次调用是为了开始执行生成器函数:

    function* generatorFn(initial){
        console.log(initial);
        console.log(yield);
        console.log(yield);
    }
    let generatorObj = generatorFn('foo');
    generatorObj.next('bar');//foo
    generatorObj.next('baz');//baz
    generatorObj.next('qux');//quz

return()和throw():提前终止生成器