📜  JavaScript 中的 yield 关键字是什么?(1)

📅  最后修改于: 2023-12-03 14:42:30.253000             🧑  作者: Mango

JavaScript 中的 yield 关键字

yield 关键字在 JavaScript 中用于定义一个生成器函数。生成器函数是一种特殊的函数,它可以暂停执行并保存其状态,稍后可以从保存的状态恢复执行。在每次调用时,生成器函数返回一个迭代器对象,可以通过这个对象逐步访问生成器函数的值。这种函数和迭代器的组合可以用来方便地创建迭代器。

语法

yield 关键字后面可以跟任何可放在表达式里的值,例如:

function* gen() {
  yield 1;
  yield 2;
  yield 3;
}

const it = gen();

console.log(it.next()); // { value: 1, done: false }
console.log(it.next()); // { value: 2, done: false }
console.log(it.next()); // { value: 3, done: false }
console.log(it.next()); // { value: undefined, done: true }

上面的例子中,gen 是一个生成器函数,调用它返回一个迭代器对象 it。每次调用迭代器对象的 next 方法,都会从生成器函数中的 yield 关键字暂停执行,并返回一个对象,其 value 属性为 yield 后的值,done 属性为 false。直到生成器函数运行到最后,不再有 yield 关键字后面的值,此时 valueundefineddonetrue,迭代器对象才会返回。

暂停和恢复执行

生成器函数可以暂停和恢复执行,这是通过生成器函数的迭代器对象的 next 方法实现的。在每次调用迭代器对象的 next 方法时,都会执行生成器函数直到遇到下一个 yield 关键字或生成器函数运行结束为止。执行过程中 yield 关键字后面的值就是迭代器对象的 value 属性,否则就是 undefined。执行到某个 yield 关键字时,生成器函数会暂停执行,并返回一条指令,指令的 value 属性为 yield 后面的值,done 属性为 false。然后迭代器对象就会返回这条指令并等待下一次 next 方法的调用,以便恢复执行。

使用示例

下面是一个使用 yield 关键字生成斐波那契数列的例子:

function* fibonacci() {
  let a = 0;
  let b = 1;
  while (true) {
    yield a;
    [a, b] = [b, a + b];
  }
}

const it = fibonacci();

console.log(it.next()); // { value: 0, done: false }
console.log(it.next()); // { value: 1, done: false }
console.log(it.next()); // { value: 1, done: false }
console.log(it.next()); // { value: 2, done: false }
console.log(it.next()); // { value: 3, done: false }
console.log(it.next()); // { value: 5, done: false }
// ...

上面的例子定义了一个生成器函数 fibonacci 来生成斐波那契数列。yield 关键字将在每次迭代中返回一个数值。在生成器函数中使用了 while(true) 来保证生成器函数永远不会结束,直到迭代器对象被销毁。因为斐波那契数列中的每个数字都依赖于前面两个数字,所以在每次迭代中都需要更新变量 ab

总结

yield 关键字可以用来定义生成器函数,并让函数在执行过程中暂停执行和恢复执行。生成器函数的返回值是一个迭代器对象,每次调用返回一个包含 valuedone 属性的对象。在生成器函数中使用 yield 关键字可以方便地定义序列和迭代器,使得 JavaScript 代码更加快捷和易于理解。