跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
JavaScript生成器
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= JavaScript生成器 = '''JavaScript生成器'''(Generators)是ES6引入的一种特殊函数,它允许通过控制函数的执行流程来生成一系列值。与普通函数不同,生成器可以暂停和恢复执行,这使得它们非常适合处理异步操作、惰性求值和迭代大型数据集。 == 基本概念 == 生成器函数使用<code>function*</code>语法定义,并通过<code>yield</code>关键字暂停执行并返回一个值。调用生成器函数不会立即执行函数体,而是返回一个'''生成器对象''',该对象遵循'''迭代器协议'''(Iterator Protocol),可以通过<code>next()</code>方法逐步执行。 === 语法示例 === <syntaxhighlight lang="javascript"> function* simpleGenerator() { yield 'First value'; yield 'Second value'; return 'Final value'; } const generator = simpleGenerator(); console.log(generator.next()); // { value: 'First value', done: false } console.log(generator.next()); // { value: 'Second value', done: false } console.log(generator.next()); // { value: 'Final value', done: true } </syntaxhighlight> === 关键特性 === * '''暂停与恢复''':生成器可以在执行过程中暂停(通过<code>yield</code>)并在之后恢复。 * '''惰性求值''':值仅在请求时生成,适用于处理无限序列或大型数据流。 * '''双向通信''':可以通过<code>next(value)</code>向生成器传递参数。 == 工作原理 == 生成器通过维护其执行上下文(包括局部变量和指令指针)来实现暂停和恢复。每次调用<code>next()</code>时,生成器从上次暂停的位置继续执行,直到遇到下一个<code>yield</code>或<code>return</code>。 === 状态图 === <mermaid> stateDiagram-v2 [*] --> Created Created --> Yielding: next() Yielding --> Yielding: next() Yielding --> Completed: return Completed --> [*] </mermaid> == 实际应用 == === 1. 生成无限序列 === 生成器非常适合表示无限序列(如斐波那契数列),因为值是按需计算的: <syntaxhighlight lang="javascript"> function* fibonacci() { let [a, b] = [0, 1]; while (true) { yield a; [a, b] = [b, a + b]; } } const fib = fibonacci(); console.log(fib.next().value); // 0 console.log(fib.next().value); // 1 console.log(fib.next().value); // 1 console.log(fib.next().value); // 2 </syntaxhighlight> === 2. 异步流程控制 === 生成器可用于简化异步代码(常与Promise结合): <syntaxhighlight lang="javascript"> function* asyncGenerator() { const result = yield fetch('https://api.example.com/data'); console.log(result); } function runAsync(generator) { const iterator = generator(); function handleNext(iteratorResult) { if (iteratorResult.done) return; iteratorResult.value .then(res => res.json()) .then(data => handleNext(iterator.next(data))); } handleNext(iterator.next()); } runAsync(asyncGenerator); </syntaxhighlight> === 3. 实现自定义迭代器 === 生成器简化了迭代器模式的实现: <syntaxhighlight lang="javascript"> const obj = { *[Symbol.iterator]() { yield 1; yield 2; yield 3; } }; for (const val of obj) { console.log(val); // 1, 2, 3 } </syntaxhighlight> == 高级特性 == === yield* 委托 === <code>yield*</code>允许生成器委托给另一个可迭代对象: <syntaxhighlight lang="javascript"> function* generatorA() { yield 'A1'; yield 'A2'; } function* generatorB() { yield 'B1'; yield* generatorA(); yield 'B2'; } console.log([...generatorB()]); // ['B1', 'A1', 'A2', 'B2'] </syntaxhighlight> === 错误处理 === 可以通过<code>throw()</code>方法向生成器抛出错误: <syntaxhighlight lang="javascript"> function* errorHandling() { try { yield 'Normal'; } catch (e) { yield `Caught: ${e}`; } } const gen = errorHandling(); console.log(gen.next()); // { value: 'Normal', done: false } console.log(gen.throw('Error!')); // { value: 'Caught: Error!', done: false } </syntaxhighlight> == 数学表达 == 生成器的暂停/恢复行为可以用状态机表示。设生成器的状态为<math>S_n</math>,则: <math> S_{n+1} = \begin{cases} \text{yield } v & \text{if } S_n \text{ reaches yield} \\ \text{return } v & \text{if } S_n \text{ reaches return} \end{cases} </math> == 总结 == JavaScript生成器提供了: * 按需生成值的惰性计算能力 * 更清晰的异步代码控制流 * 简化迭代器实现的语法糖 * 与其他语言特性(如async/await)的深度集成 虽然现代JavaScript中<code>async/await</code>更常用于处理异步操作,但生成器仍然是处理复杂控制流、数据流和状态管理的强大工具。 [[Category:编程语言]] [[Category:JavaScript]] [[Category:Javascript现代特性]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)