📅  最后修改于: 2023-12-03 14:42:30.253000             🧑  作者: Mango
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
关键字后面的值,此时 value
为 undefined
,done
为 true
,迭代器对象才会返回。
生成器函数可以暂停和恢复执行,这是通过生成器函数的迭代器对象的 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)
来保证生成器函数永远不会结束,直到迭代器对象被销毁。因为斐波那契数列中的每个数字都依赖于前面两个数字,所以在每次迭代中都需要更新变量 a
和 b
。
yield
关键字可以用来定义生成器函数,并让函数在执行过程中暂停执行和恢复执行。生成器函数的返回值是一个迭代器对象,每次调用返回一个包含 value
和 done
属性的对象。在生成器函数中使用 yield
关键字可以方便地定义序列和迭代器,使得 JavaScript 代码更加快捷和易于理解。