📜  解释 ES6 中的生成器函数(1)

📅  最后修改于: 2023-12-03 15:27:56.529000             🧑  作者: Mango

解释 ES6 中的生成器函数

在 ES6 中,引入了生成器函数(Generator Function)的概念,它可以用来生成迭代器(Iterator),进一步方便迭代器的使用。生成器函数使用起来比较简单,但是理解其原理和机制也非常重要。

生成器函数的定义和使用

在 JavaScript 中,生成器函数的定义使用关键字 function*,如下所示:

function* myGeneratorFn() {
  yield 'first';
  yield 'second';
  yield 'third';
}

在生成器函数中可以使用 yield 关键字,它用来暂停函数的执行,并且返回一个值。生成器函数执行时,会返回一个生成器对象,我们可以使用该对象的 next() 方法来依次获取 yield 返回的值。例如:

const myGenerator = myGeneratorFn();
console.log(myGenerator.next()); // { value: 'first', done: false }
console.log(myGenerator.next()); // { value: 'second', done: false }
console.log(myGenerator.next()); // { value: 'third', done: false }
console.log(myGenerator.next()); // { value: undefined, done: true }

上述代码中,我们首先创建了一个生成器对象 myGenerator,接着使用 next() 方法获取生成器函数 myGeneratorFn 中定义的值。

生成器函数的执行机制

生成器函数和普通函数的主要区别在于:生成器函数可以通过 yield 关键字实现暂停执行的功能,以便于函数在后续时刻继续执行。

当执行 myGeneratorFn() 函数时,它会返回一个生成器对象,但是此时函数中的代码并未立即执行。只有当第一次调用 next() 方法时,函数内部的代码才会开始执行。执行到 yield 时,函数的执行会暂停,并设定 yield 后面的表达式作为返回值。当外部再次调用 next() 时,函数会从上次暂停的位置开始执行,直到遇到下一个 yield 或者函数结束。这个过程将重复直到函数执行到最后一行代码,并且返回的对象的属性 done 设为 true

生成器函数的应用

生成器函数常见的使用场景是生成一个可迭代对象,这在实际编程中非常有用。例如:

function* range(start, end) {
  for (let i = start; i <= end; i++) {
    yield i;
  }
}

for (let n of range(1, 5)) {
  console.log(n);
}

上述代码中,我们使用生成器函数 range() 生成了一个可迭代对象,可以直接使用 for...of 循环遍历。

结语

在 ES6 中引入了生成器函数的概念,可以用来方便地生成迭代器。生成器函数可以使用 yield 暂停函数的执行,并返回一个值,其执行机制比较奇妙,但掌握它的使用和机制非常有利于提高编程效率和代码质量。