生成器 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关键字之间加上一个*号,则该函数会自动返回一个生成器
生成器函数的特点:
-
调用生成器函数,会返回一个生成器,而不是执行函数体(因为,生成器函数的函数体执行,收到生成器控制)
-
每当调用了生成器的next方法,生成器的函数体会从上一次yield的位置(或开始位置)运行到下一个yield
- yield关键字只能在生成器内部使用,不可以在普通函数内部使用
- 它表示暂停,并返回一个当前迭代的数据
- 如果没有下一个yield,到了函数结束,则生成器的next方法得到的结果中的done为true
-
yield关键字后面的表达式返回的数据,会作为当前迭代的数据
-
生成器函数的返回值,会作为迭代结束时的value
- 但是,如果在结束过后,仍然反复调用next,则value为undefined
-
生成器调用next的时候,可以传递参数,该参数会作为生成器函数体上一次yield表达式的值。
- 生成器第一次调用next函数时,传递参数没有任何意义
-
生成器带有一个throw方法,该方法与next的效果相同,唯一的区别在于:
- next方法传递的参数会被返回成一个正常值
- throw方法传递的参数是一个错误对象,会导致生成器函数内部发生一个错误。
-
生成器带有一个return方法,该方法会直接结束生成器函数
-
若需要在生成器内部调用其他生成器,注意:如果直接调用,得到的是一个生成器,如果加入*号调用,则进入其生成器内部执行。如果是
yield* 函数()调用生成器函数,则该函数的返回结果,为该表达式的结果