function 用于定义生成器函数,返回可暂停/恢复的生成器对象;yield 产出单值,yield 委托可迭代对象;生成器原生支持迭代协议,并可通过 next(value) 实现双向通信。

JavaScript 中的 function* 是定义生成器函数的关键字,它创建的函数会返回一个生成器对象(Generator Object),这个对象是一个迭代器,可以**暂停和恢复执行**,适合处理惰性求值、分步计算、异步流程控制等场景。
生成器函数的基本语法和行为
生成器函数用 function* 声明(* 紧跟在 function 后,空格可选),内部使用 yield 暂停执行并产出一个值。每次调用生成器对象的 next() 方法,函数就从上次暂停处继续运行,直到下一个 yield 或结束。
例如:
function* count() {
yield 1;
yield 2;
yield 3;
}
const it = count();
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 }
yield 和 yield* 的区别
yield 产出单个值;yield* 则用于委托另一个可迭代对象(如另一个生成器、数组、字符串等),把它的遍历结果“展开”到当前生成器中。
立即学习“Java免费学习笔记(深入)”;
yield [1,2,3]:产出整个数组作为一个值yield* [1,2,3]:逐个产出 1、2、3yield* anotherGenerator():把另一个生成器的每个 yield 值依次产出
生成器与迭代协议的天然契合
生成器函数自动实现 Symbol.iterator,所以生成器对象本身是可迭代的,能直接用于 for...of、扩展运算符 [...gen]、解构等:
function* fib() {
let a = 0, b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
for (const n of fib()) {
if (n > 100) break;
console.log(n); // 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89
}
生成器也可接收外部传入的值(通过 next(value))
next() 方法可带参数,该参数会成为上一个 yield 表达式的返回值——这使得生成器具备双向通信能力,常用于协程式编程或状态机建模:
function* ask() {
const name = yield “What is your name?”;
yield `Hello, ${name}!`;
}
const q = ask();
console.log(q.next()); // { value: “What is your name?”, done: false }
console.log(q.next(“Alice”)); // { value: “Hello, Alice!”, done: false }
基本上就这些。生成器不是必须掌握的日常语法,但在需要精细控制执行流、封装异步逻辑(比如早期的 co 库)、或构建自定义迭代逻辑时,它提供了简洁而强大的表达力。
以上就是javascript如何实现生成器_ function* 是什么的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1543811.html
微信扫一扫
支付宝扫一扫