推荐答案
Generator 函数是 ES6 引入的一种特殊函数,它可以通过 function* 语法定义,并且可以使用 yield 关键字来暂停和恢复函数的执行。Generator 函数返回一个 Generator 对象,该对象遵循迭代器协议,可以通过 next() 方法逐步执行函数体中的代码。
本题详细解读
1. Generator 函数的定义
Generator 函数使用 function* 语法定义,函数体内可以使用 yield 关键字来暂停函数的执行,并返回一个值。每次调用 next() 方法时,函数会从上次暂停的地方继续执行,直到遇到下一个 yield 或函数结束。
// www.javascriptcn.com code example
function* myGenerator() {
yield 1;
yield 2;
yield 3;
}
const gen = myGenerator();
console.log(gen.next().value); // 输出 1
console.log(gen.next().value); // 输出 2
console.log(gen.next().value); // 输出 32. Generator 函数的执行过程
Generator 函数不会立即执行,而是返回一个 Generator 对象。调用 next() 方法时,函数会从上次暂停的地方继续执行,直到遇到 yield 或 return 语句。yield 会暂停函数执行并返回一个值,而 return 会结束函数执行并返回一个值。
// www.javascriptcn.com code example
function* myGenerator() {
yield 'start';
yield 'middle';
return 'end';
}
const gen = myGenerator();
console.log(gen.next().value); // 输出 'start'
console.log(gen.next().value); // 输出 'middle'
console.log(gen.next().value); // 输出 'end'
console.log(gen.next().done); // 输出 true3. Generator 函数的应用场景
Generator 函数常用于异步编程、惰性求值、无限序列等场景。通过 yield 和 next() 的配合,可以实现复杂的控制流。
// www.javascriptcn.com code example
function* infiniteSequence() {
let i = 0;
while (true) {
yield i++;
}
}
const gen = infiniteSequence();
console.log(gen.next().value); // 输出 0
console.log(gen.next().value); // 输出 1
console.log(gen.next().value); // 输出 2
// 可以无限调用 next() 方法4. Generator 函数与迭代器的关系
Generator 函数返回的 Generator 对象实现了迭代器协议,因此可以使用 for...of 循环来遍历 Generator 函数生成的值。
// www.javascriptcn.com code example
function* myGenerator() {
yield 1;
yield 2;
yield 3;
}
for (const value of myGenerator()) {
console.log(value); // 依次输出 1, 2, 3
}5. Generator 函数的错误处理
Generator 函数可以通过 throw() 方法在函数体内抛出错误,并通过 try...catch 捕获错误。
// www.javascriptcn.com code example
function* myGenerator() {
try {
yield 1;
yield 2;
yield 3;
} catch (e) {
console.log('Error caught:', e);
}
}
const gen = myGenerator();
console.log(gen.next().value); // 输出 1
gen.throw(new Error('Something went wrong')); // 输出 'Error caught: Error: Something went wrong'