推荐答案
yield 关键字用于暂停和恢复生成器函数的执行。它允许生成器函数在每次调用 next() 方法时生成一个值,并在生成值后暂停执行,直到再次调用 next() 方法。yield 关键字还可以用于接收外部传入的值。
本题详细解读
1. 生成器函数
生成器函数是一种特殊的函数,使用 function* 语法定义。生成器函数在执行时不会立即运行,而是返回一个生成器对象。生成器对象遵循迭代器协议,可以通过 next() 方法逐步执行函数体。
// www.javascriptcn.com code example
function* generatorFunction() {
yield 1;
yield 2;
yield 3;
}
const generator = generatorFunction();
console.log(generator.next().value); // 输出: 1
console.log(generator.next().value); // 输出: 2
console.log(generator.next().value); // 输出: 32. yield 的作用
yield 关键字在生成器函数中有两个主要作用:
暂停执行:当生成器函数执行到
yield语句时,函数会暂停执行,并返回yield后面的值。此时,生成器函数的状态会被保存,直到下一次调用next()方法。恢复执行:当调用生成器对象的
next()方法时,生成器函数会从上次暂停的地方继续执行,直到遇到下一个yield语句或函数结束。
3. yield 与 next() 的交互
yield 不仅可以返回值,还可以接收外部传入的值。当调用 next() 方法时,可以传递一个参数,这个参数会成为 yield 表达式的返回值。
// www.javascriptcn.com code example
function* generatorFunction() {
const value1 = yield 'First yield';
console.log(value1); // 输出: 'Passed to next'
const value2 = yield 'Second yield';
console.log(value2); // 输出: 'Another value'
}
const generator = generatorFunction();
console.log(generator.next().value); // 输出: 'First yield'
console.log(generator.next('Passed to next').value); // 输出: 'Second yield'
console.log(generator.next('Another value').value); // 输出: undefined4. yield* 表达式
yield* 表达式用于委托给另一个生成器或可迭代对象。它可以简化生成器函数的编写,特别是在需要嵌套生成器时。
// www.javascriptcn.com code example
function* generator1() {
yield 1;
yield 2;
}
function* generator2() {
yield* generator1();
yield 3;
}
const generator = generator2();
console.log(generator.next().value); // 输出: 1
console.log(generator.next().value); // 输出: 2
console.log(generator.next().value); // 输出: 35. 总结
yield 关键字是生成器函数的核心,它使得生成器函数能够暂停和恢复执行,从而实现更灵活的控制流。通过 yield,生成器函数可以逐步生成值,并且可以与外部代码进行双向通信。