Generator函数是ES6中新增的一种函数类型,它使用function*声明,可以被理解为一种状态机,在函数执行过程中可以通过yield表达式控制函数的执行进度。
关键词function、yield、状态机都是该主题的重点。其中星号是用于标识定义 Generator 函数时的语法结构,yield 表达式则用于指定 Generator 函数返回的值,可以多次执行以产生一个序列不同的值。因此,Generator 函数也常被称为“协程”或“生成器”。在 Javascript 中,Generator 函数特别适合处理异步操作的流程控制问题,使得编写异步代码更加简单、直观。
举个例子,下面的代码展示了一个简单的Generator函数,其中每次执行next()会打印出断点处的console.log,并将值传回指定变量。
function* generatorFunction() {
console.log('Checkpoint 1');
yield 1;
console.log('Checkpoint 2')
yield 2;
console.log('Checkpoint 3');
yield 3;
}
let generatorObject = generatorFunction();
console.log(generatorObject.next().value);
console.log(generatorObject.next().value);
console.log(generatorObject.next().value);
输出结果为:
Checkpoint 1
1
Checkpoint 2
2
Checkpoint 3
3
需要注意的是,Generator函数执行并不会立即执行函数体内的逻辑,而是返回一个迭代器对象。通过调用迭代器对象的next()方法来推进函数的执行。每次调用next()方法会执行到下一个yield表达式,返回上一次执行时yield表达式中的表达式的值。
总之,Generator 函数在 JavaScript 编程中具有重要的应用价值,在异步编程、协程编写等场景下可以更简单高效地实现任务分发和控制流。