返回
手把手带你玩转ES6 (八):探索 Generator 的奥妙
前端
2023-12-30 14:18:07
Generator 函数:深入浅出
Generator 函数是一个状态机,封装了多个内部状态。它返回的遍历器对象,可以一次遍历Generator 函数内部的每个状态。由于Generator 函数返回的遍历器对象只有调用next方法才会遍历下一个内部状态,所以它提供了一种可暂停和恢复执行的机制。
Generator函数使用yield来定义内部状态,yield关键字可以将Generator函数暂停在当前执行的位置,并返回一个值。当Generator函数被重新调用时,它将从yield关键字暂停的位置继续执行。
Generator函数可以用于实现迭代器,迭代器是一个对象,它可以被循环遍历。Generator函数通过yield关键字来生成值,这些值可以被迭代器循环遍历。
Generator 函数的优势
Generator 函数与普通的函数相比,具有以下优势:
- 可暂停和恢复执行:Generator 函数可以通过yield关键字来暂停和恢复执行,这使得它非常适合用于实现迭代器。
- 代码更简洁:Generator 函数的代码通常比普通的函数更简洁,因为不需要使用额外的循环或递归来实现迭代。
- 性能更好:Generator 函数的性能通常优于普通的函数,因为Generator 函数只在需要的时候才生成值,而普通函数则会一次性生成所有值。
Generator 函数的应用
Generator 函数可以用于实现各种各样的功能,包括:
- 迭代器:Generator 函数可以用于实现迭代器,迭代器是一个对象,它可以被循环遍历。
- 异步编程:Generator 函数可以用于实现异步编程,异步编程是一种编程范式,它允许在不阻塞主线程的情况下执行耗时操作。
- 状态机:Generator 函数可以用于实现状态机,状态机是一种抽象概念,它可以用来一个系统的状态及其变化。
Generator 函数的实例
下面是一个Generator 函数的例子:
function* fibonacci() {
let [prev, curr] = [0, 1];
while (true) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
const fib = fibonacci();
console.log(fib.next().value); // 1
console.log(fib.next().value); // 1
console.log(fib.next().value); // 2
console.log(fib.next().value); // 3
console.log(fib.next().value); // 5
这个Generator 函数生成斐波那契数列,斐波那契数列是一个无限的数列,它的第一个和第二个数都是1,之后每个数都是前两个数的和。
我们使用next方法来调用fib Generator 函数,每次调用next方法都会生成斐波那契数列的下一个值。
Generator 函数的总结
Generator 函数是一种强大的遍历工具,也是一种封装多个内部状态的状态机。它返回的遍历器对象可以一次遍历Generator 函数内部的每个状态。Generator 函数可以用于实现迭代器、异步编程和状态机等功能。
Generator 函数与普通的函数相比,具有以下优势:
- 可暂停和恢复执行
- 代码更简洁
- 性能更好