ES6之生成器
1. 生成器是什么?
拥有在一个函数块内暂停和恢复代码执行的能力的结构。
生成器的形式可以是一个函数,在函数名称前加一个表示它是一个生成器(箭头函数不能定义生成器函数),的位置不影响函数生成器的定义。
调用生成器函数会产生生成器对象。然后处于暂停执行的状态,调用next()函数会让生成器开始或恢复执行。next的返回器与Iterator相同,有done属性和value属性。
生成器自己实现了迭代器接口,默认的迭代器是自引用的。
2. 通过yield中断执行
在生成器中,yield可以作为暂停操作,并且yield后的返回值会作为next()函数返回的值。并且生成器内部的yield为可迭代对象,可以迭代生成器内部的yield。
yield也可以实现输入与输出,将参数传入函数,通过yield返回或展示,也可以迭代调用yield实现生成器函数。
yield加上*可以迭代一个可迭代对象,使他一次next只能返回一个单独值。也可以将生成器作为迭代值返回,可以迭代一个可迭代的生成器对象。
3. 如果提前终止生成器
- return()
该方法会强制生成器进入关闭状态,提供给return方法的值就是终止迭代器对象的值。 - throw()
该方法会在暂停的时候将一个提供的错误注入到生成器对象中。如果错误未被处理,生成器就会关闭。假如生成器处理了该错误,就不会关闭,会恢复执行。错误处理会跳过对应的yield。就是当前迭代器返回的值。处理错误时会返回抛出的东西。
4. 小结
生成器是一种特殊的函数,调用会返回一个生成器对象。生成器自动实现Iterable接口,因此可以用在任何消费可迭代对象的地方。生成器还支持yield可以暂停生成器函数,使用yield可以通过next函数接收输入和产生输出,加上*后可以将可迭代对象序列号为单一值迭代返回。