跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScriptNode.js大前端

JavaScript 生成器详解:yield 如何控制函数执行流程

yield 关键字用于暂停和恢复生成器函数的执行,保留作用域状态。每次调用 next() 返回包含 done 和 value 的对象,yield 对应 done:false,return 对应 done:true。每个生成器实例拥有独立的作用域,互不影响。yield 必须在生成器函数内部直接使用,不能嵌套在非生成器函数中,否则抛出语法错误。掌握 yield 是理解异步编程和迭代协议的关键。

steve发布于 2024/1/15更新于 2026/10/1884 浏览
JavaScript 生成器详解:yield 如何控制函数执行流程

JavaScript 生成器核心:深入理解 yield

在 JavaScript 中,yield 关键字是生成器(Generator)最核心的特性。它允许函数在执行过程中暂停,并在后续恢复,同时保留当前的作用域状态。这不仅仅是简单的返回,而是对执行流的精细控制。

暂停与恢复机制

生成器函数在遇到 yield 之前会正常执行。一旦碰到这个关键字,执行立即停止,但函数的局部变量和调用栈上下文会被完整保留。要恢复执行,必须通过生成器对象调用 next() 方法。

function* generatorFn() {
  yield;
}

let generatorObject = generatorFn();
console.log(generatorObject.next()); // { done: false, value: undefined }
console.log(generatorObject.next()); // { done: true, value: undefined }

此时 yield 有点像函数的中间返回语句,但它不会终止函数。生成的值会出现在 next() 返回的对象里。如果通过 yield 退出当前步骤,生成器处于 done: false 状态;只有当函数自然结束或通过 return 关键字显式返回时,才会进入 done: true 状态。

返回值与完成状态

我们可以对比一下 yield 和 return 在生成器中的表现。yield 产出值并挂起,而 return 直接结束函数。

function* generatorFn() {
  yield 'foo';
  yield 'bar';
  return 'baz';
}

let generatorObject = generatorFn();
console.log(generatorObject.next()); // { done: false, value: 'foo' }
console.log(generatorObject.next()); // { done: false, value: 'bar' }
console.log(generatorObject.next()); // { done: true, value: 'baz' }

注意最后一步,return 'baz' 不仅产出了值,还标记了生成器的完成状态。

实例隔离性

生成器函数内部的执行流程是针对每个生成器对象区分作用域的。这意味着同一个函数创建出的多个实例互不干扰。

function* generatorFn() {
  yield 'foo';
  yield 'bar';
  return 'baz';
}

let generatorObject1 = generatorFn();
let generatorObject2 = generatorFn();

console.log(generatorObject1.next()); // { done: false, value: 'foo' }
console.log(generatorObject2.next()); // { done: false, value: 'foo' }
console.log(generatorObject2.next()); // { done: false, value: 'bar' }
console.log(generatorObject1.next()); // { done: false, value: 'bar' }

即使两个对象来自同一个函数定义,它们各自维护独立的执行指针和状态。

使用范围限制

yield 关键字只能在生成器函数内部直接使用。如果在普通函数、箭头函数或嵌套的非生成器函数中使用,会抛出语法错误。

// 有效
function* validGeneratorFn() {
  yield;
}

// 无效:yield 不能用于普通函数
function* invalidGeneratorFnA() {
  function a() {
    yield; 
  }
}

// 无效:yield 不能用于箭头函数
function* invalidGeneratorFnB() {
  const b = () => {
    yield;
  };
}

// 无效:yield 不能用于立即执行的箭头函数
function* invalidGeneratorFnC() {
  (() => {
    yield;
  })();
}

在实际开发中,如果你发现代码报出类似 "Unexpected token" 的错误,且涉及 yield,请检查它是否被包裹在了非生成器函数内部。这是初学者最容易踩的坑之一。

掌握 yield 的执行控制逻辑,是理解异步编程、迭代协议以及更高级并发模型的基础。

目录

  1. JavaScript 生成器核心:深入理解 yield
  2. 暂停与恢复机制
  3. 返回值与完成状态
  4. 实例隔离性
  5. 使用范围限制

更多推荐文章

查看全部
  • AI 论文工具隐私风险分析与安全使用指南
  • PyBlueZ 完整指南:Python 蓝牙编程实战
  • AI 实体识别服务 WebUI 交互设计与体验优化
  • 学生与教育工作者免费获取 GitHub Copilot 权限指南
  • C++ 中 lower_bound 与 upper_bound 函数详解
  • 为什么当前 AI 大模型主要基于 Python 开发
  • C++ 多态底层实现原理详解:虚函数表与对象模型
  • GitHub 界面中文化插件安装与配置指南
  • Python 调用 ChatGPT API 入门与实战
  • Python 调用 Web Scraper API 抓取 Glassdoor 数据全流程实战
  • SmolVLA 模型 TensorRT 加速实战:ONNX 导出与部署优化
  • 微软发布 SPREADSHEETLLM:大模型精准理解与推理 Excel
  • 常见排序算法原理及 Java 实现
  • Mac Intel 芯片安卓模拟器安装与使用指南
  • 9 篇大模型前沿论文精选
  • Neo4j Desktop 2 安装与使用指南
  • Windows 系统安装与配置 Neo4j 图数据库指南
  • Git 版本控制快速入门详解
  • AI 智能答题助手 (AI Study Copilot) —— 你的下一代学习辅助神器
  • Kubernetes 与开发语言:.NET Core 和 Java 的云原生实践

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online