生成器的应用
主要参考资料:
- 《JavaScript 高级程序设计(第4版)》- P199P221(224226/931)
实现递归
使用生成器实现递归:
- 通过在生成器中迭代该生成器的生成器对象。
示例:
function *generator(n) {
if(n > 0) {
yield* generator(n - 1)
yield n - 1
}
}
for(const item of generator(3)) {
console.log(item)
}
// 输出:
// 0
// 1
// 2
示例代码的主要执行过程:
- 全局作用域 Global
- 开启作用域 Global-ForOf
- 执行语句
for-of迭代生成器对象generator(3)
- 执行语句
- 暂停作用域 Global-ForOf
- 开启新的作用域 Global-ForOf-G3
- 执行生成器中的代码
- 存储
n = 3 - 判断
n > 0为true - 进入语句
if yield*迭代生成器对象generator(2)
- 暂停作用域 Global-ForOf-G3
- 开启新的作用域 Global-ForOf-G3-G2
- 执行生成器中的代码
- 存储
n = 2 - 判断
n > 0为true - 进入语句
if yield*迭代生成器对象generator(1)
- 暂停作用域 Global-ForOf-G3-G2
- 开启新的作用域 Global-ForOf-G3-G2-G1
- 执行生成器中的代码
- 存储
n = 1 - 判断
n > 0为true - 进入语句
if yield*迭代生成器对象generator(0)
- 暂停作用域 Global-ForOf-G3-G2-G1
- 开启新的作用域 Global-ForOf-G3-G2-G1-G0
- 执行生成器中的代码
- 存储
n = 0 - 判断
n > 0为false - 绕过语句
if return返回undefined
- 关闭作用域 Global-ForOf-G3-G2-G1-G0
- 开启新的作用域 Global-ForOf-G3-G2-G1-G0
- 重启作用域 Global-ForOf-G3-G2-G1
yield返回n - 1- 读取
n = 1,返回值0
- 暂停作用域 Global-ForOf-G3-G2-G1
- 开启新的作用域 Global-ForOf-G3-G2-G1
- 开启新的作用域 Global-ForOf-G3-G2
- 开启新的作用域 Global-ForOf-G3
- 重启作用域 Global-ForOf
- 迭代生成器对象
generator(3)返回迭代结果{ done: false, value: 0 } - 判断
done为false - 将
value的值0赋值给item - 进入语句
for-of,console.log(item)输出0 - 再次执行语句
for-of迭代生成器对象generator(3)
- 迭代生成器对象
- 暂停作用域 Global-ForOf
- 重启作用域 Global-ForOf-G3-G2-G1
return返回undefined
- 关闭作用域 Global-ForOf-G3-G2-G1
- 重启作用域 Global-ForOf-G3-G2
yield返回n - 1- 读取
n = 2,返回值1
- 暂停作用域 Global-ForOf-G3-G2
- 重启作用域 Global-ForOf-G3-G2-G1
- 重启作用域 Global-ForOf
- 迭代生成器对象
generator(3)返回迭代结果{ done: false, value: 1 } - 判断
done为false - 将
value的值1赋值给item - 进入语句
for-of,console.log(item)输出1 - 再次执行语句
for-of迭代生成器对象generator(3)
- 迭代生成器对象
- 暂停作用域 Global-ForOf
- 重启作用域 Global-ForOf-G3-G2
return返回undefined
- 关闭作用域 Global-ForOf-G3-G2
- 重启作用域 Global-ForOf-G3
yield返回n - 1- 读取
n = 3,返回值2
- 暂停作用域 Global-ForOf-G3
- 重启作用域 Global-ForOf-G3-G2
- 重启作用域 Global-ForOf
- 迭代生成器对象
generator(3)返回迭代结果{ done: false, value: 2 } - 判断
done为false - 将
value的值2赋值给item - 进入语句
for-of,console.log(item)输出2 - 再次执行语句
for-of迭代生成器对象generator(3)
- 迭代生成器对象
- 暂停作用域 Global-ForOf
- 重启作用域 Global-ForOf-G3
return返回undefined
- 关闭作用域 Global-ForOf-G3
- 重启作用域 Global-ForOf-G3
- 重启作用域 Global-ForOf
- 迭代生成器对象
generator(3)返回迭代结果{ done: true, value: undefined } - 判断
done为false
- 迭代生成器对象
- 关闭作用域 Global-ForOf
- 开启作用域 Global-ForOf
迭代嵌套可迭代对象的元素
使用生成器迭代嵌套可迭代对象的元素:
- 在定义可迭代对象类时,将生成器作为可迭代对象的默认迭代器函数。
示例:
// 可迭代对象类
class Iterable {
constructor() {
this.values = [1, 2, 3]
}
// 将生成器作为默认迭代器函数
*[Symbol.iterator]() {
yield* this.values
}
}
// 创建可迭代对象
const iterable = new Iterable()
for(const item of iterable) {
console.log(item)
}
// 输出:
// 1
// 2
// 3
本文探讨了JavaScript中的生成器,重点在于如何利用生成器实现递归以及迭代嵌套的可迭代对象。通过详细的执行过程解释,展示了生成器在处理复杂逻辑时的优势。
295

被折叠的 条评论
为什么被折叠?



