生成器 generator

175 阅读2分钟

生成器 generator

generator

生成器:由构造函数Generator创建的对象,该对象既是一个迭代器,同时,又是一个可迭代对象(满足可迭代协议的对象)

//伪代码

var generator = new Generator();
generator.next();//它具有next方法
var iterator = generator[Symbol.iterator];//它也是一个可迭代对象
for(const item of generator){
    //由于它是一个可迭代对象,因此也可以使用for of循环
}

注意:Generator构造函数,不提供给开发者使用,仅作为JS引擎内部使用

generator function

生成器函数(生成器创建函数):该函数用于创建一个生成器。

ES6新增了一个特殊的函数,叫做生成器函数,只要在函数名与function关键字之间加上一个*号,则该函数会自动返回一个生成器

生成器函数的特点:

  1. 调用生成器函数,会返回一个生成器,而不是执行函数体(因为,生成器函数的函数体执行,收到生成器控制)

  2. 每当调用了生成器的next方法,生成器的函数体会从上一次yield的位置(或开始位置)运行到下一个yield

    1. yield关键字只能在生成器内部使用,不可以在普通函数内部使用
    2. 它表示暂停,并返回一个当前迭代的数据
    3. 如果没有下一个yield,到了函数结束,则生成器的next方法得到的结果中的done为true
  3. yield关键字后面的表达式返回的数据,会作为当前迭代的数据

  4. 生成器函数的返回值,会作为迭代结束时的value

    1. 但是,如果在结束过后,仍然反复调用next,则value为undefined
  5. 生成器调用next的时候,可以传递参数,该参数会作为生成器函数体上一次yield表达式的值。

    1. 生成器第一次调用next函数时,传递参数没有任何意义
  6. 生成器带有一个throw方法,该方法与next的效果相同,唯一的区别在于:

    1. next方法传递的参数会被返回成一个正常值
    2. throw方法传递的参数是一个错误对象,会导致生成器函数内部发生一个错误。
  7. 生成器带有一个return方法,该方法会直接结束生成器函数

  8. 若需要在生成器内部调用其他生成器,注意:如果直接调用,得到的是一个生成器,如果加入*号调用,则进入其生成器内部执行。如果是yield* 函数()调用生成器函数,则该函数的返回结果,为该表达式的结果