JavaScript中的Generator函数与迭代器
字数 736 2025-11-04 08:34:41
JavaScript中的Generator函数与迭代器
描述
Generator(生成器)是ES6引入的一种异步编程解决方案,它可以暂停和恢复函数执行。Generator函数通过function*声明,内部使用yield表达式定义暂停点。与之紧密相关的概念是迭代器(Iterator),它是一种统一的遍历接口。理解Generator需要掌握其执行机制、与迭代器的关系以及实际应用场景。
知识讲解
-
迭代器(Iterator)基础
- 迭代器是一个具有
next()方法的对象,每次调用next()返回{value: any, done: boolean}结构。 - 示例:
const arr = [1, 2]; const iterator = arr[Symbol.iterator](); // 获取数组的迭代器 console.log(iterator.next()); // {value: 1, done: false} console.log(iterator.next()); // {value: 2, done: false} console.log(iterator.next()); // {value: undefined, done: true}
- 迭代器是一个具有
-
Generator函数定义与执行
- 通过
function*定义,函数体内使用yield暂停执行,并返回一个迭代器对象。 - 示例:
function* simpleGenerator() { yield 'Hello'; yield 'World'; } const gen = simpleGenerator(); // 返回迭代器,但函数未立即执行 console.log(gen.next()); // {value: 'Hello', done: false} console.log(gen.next()); // {value: 'World', done: false} console.log(gen.next()); // {value: undefined, done: true}
- 通过
-
yield关键字的双向通信
yield不仅可返回值,还可通过next(param)向Generator内部传递参数。- 示例:
function* chatGenerator() { const name = yield 'What is your name?'; // 暂停,等待外部输入 yield `Hello, ${name}!`; } const gen = chatGenerator(); console.log(gen.next().value); // 输出: What is your name? console.log(gen.next('Alice').value); // 输出: Hello, Alice!
-
错误处理与return
- 通过
throw()方法向Generator内部抛出错误,可通过try...catch捕获。 return()方法会提前终止迭代。- 示例:
function* errorGenerator() { try { yield 'Start'; } catch (e) { yield `Error: ${e}`; } } const gen = errorGenerator(); gen.next(); // 执行到yield 'Start' console.log(gen.throw('Something wrong')); // {value: 'Error: Something wrong', done: false}
- 通过
-
实际应用场景
- 异步操作同步化:配合Promise简化异步代码(如早期异步方案,现多被async/await替代)。
- 惰性计算:需要时才生成值,节省内存(如无限数列生成)。
- 控制流程:实现自定义的迭代逻辑(如遍历树结构)。
总结
Generator函数通过yield暂停执行,返回的迭代器允许逐步控制函数执行流程。其核心价值在于提供了一种灵活的惰性执行机制,虽在异步编程中逐渐被async/await取代,但在处理复杂迭代逻辑时仍具优势。