当前位置: 首页 > news >正文

ES6 Generator函数的语法 (七)

ES6 中的 Generator函数是一种特殊类型的函数,它允许你控制函数的执行流程,使其在执行过程中可以多次暂停和恢复。Generator 函数在定义时使用星号 * 作为后缀。

主要特性:

  • 惰性计算:Generator 函数执行到 yield 表达式时会暂停,下一次再从上次暂停的地方继续执行。
  • 多次迭代:与传统函数不同,Generator 函数可以被迭代多次,每次迭代都会返回一个新的值。
  • 状态保持:Generator 函数在暂停和恢复时能够保持其内部状态。
    可接受输入:在下一次迭代时,可以通过 next() 方法向 Generator 函数传递参数。

常用方法:

  • next(value):继续执行 Generator 函数,并返回一个包含 value 和 done 属性的对象。value 是 yield 表达式返回的值,done 表示函数是否执行完毕。
  • return(value):结束 Generator 函数的执行,返回一个包含 value 和 done 属性为 true 的对象。
  • throw(error):向 Generator 函数中抛出错误。

1. 基本的 Generator 函数

function* helloWorld() {console.log("Hello");yield;console.log("World");
}let generator = helloWorld();generator.next(); // 输出: Hello,但不会继续执行到 "World"
generator.next(); // 输出: World,并结束函数

2. 使用 yield 返回值

function* generateSequence() {yield 1;yield 2;yield 3;
}let sequenceGenerator = generateSequence();console.log(sequenceGenerator.next()); // { value: 1, done: false }
console.log(sequenceGenerator.next()); // { value: 2, done: false }
console.log(sequenceGenerator.next()); // { value: 3, done: false }
console.log(sequenceGenerator.next()); // { value: undefined, done: true }

3. 在 for…of 循环中使用 Generator 函数

function* generateArrayOfNumbers() {yield* [1, 2, 3];
}for (let num of generateArrayOfNumbers()) {console.log(num); // 依次输出 1, 2, 3
}

4. 向 Generator 函数传递参数

function* count() {let count = 0;while (true) {count++; // 每次迭代计数加一console.log(`Count: ${count}`);yield count; // 返回当前计数}
}let counter = count();
counter.next(); // 开始计数
counter.next(); // 继续计数// 传递参数给 Generator 函数(在这个例子中没有使用,但展示了如何传递)
counter.next(10); // 参数通常用于控制 Generator 函数的行为

5. 使用 try…catch 捕获 Generator 函数中的错误

function* generatorWithThrow() {yield 1;throw new Error("Something went wrong!");yield 2;
}let errorGen = generatorWithThrow();try {console.log(errorGen.next()); // { value: 1, done: false }console.log(errorGen.next()); // 将抛出错误
} catch (e) {console.error(e.message); // 输出:Something went wrong!
}

6. 使用 yield 委托给另一个 Generator 函数或可迭代对象*

function* delegateGenerator() {yield* ["Hello", "World"];
}function* rootGenerator() {yield "Start";yield* delegateGenerator();yield "End";
}let root = rootGenerator();console.log(root.next()); // { value: "Start", done: false }
console.log(root.next()); // { value: "Hello", done: false }
console.log(root.next()); // { value: "World", done: false }
console.log(root.next()); // { value: "End", done: false }
console.log(root.next()); // { value: undefined, done: true }

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Android 自定义Edittext 和TextView 提示文字和填入内容不同的粗细组件
  • 【Linux】shell基础知识点(updating)
  • 欧科云链研究院:坎昆升级后,Layer2变得更好了吗?
  • 解决了一个java Bug:Exception in thread “main“ java.lang.NullPointerException
  • [Hello-algo] 复杂度分析
  • 【数据基础】— B树
  • IOT 可编程控制系统
  • 智慧校园信息化大平台整体解决方案PPT(75页)
  • Python | Leetcode Python题解之第227题基本计算器II
  • WebSocket、socket.io-client
  • 前端JS特效第34波:jQuery支持拖拽图片上传的图片批量上传插件
  • 提高项目透明度:有效的跟踪软件
  • 笔记:使用Microsoft.EntityFrameworkCore.Proxies做数据库延迟加载
  • E12.【C语言】练习:求两个数的最大公约数
  • Java实现堆排序算法详解及优化
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Android开源项目规范总结
  • Docker入门(二) - Dockerfile
  • hadoop集群管理系统搭建规划说明
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript 一些 DOM 的知识点
  • js 实现textarea输入字数提示
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • NSTimer学习笔记
  • Spring Boot MyBatis配置多种数据库
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 阿里云Kubernetes容器服务上体验Knative
  • 包装类对象
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 将回调地狱按在地上摩擦的Promise
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 前端代码风格自动化系列(二)之Commitlint
  • 前端性能优化--懒加载和预加载
  • 前端自动化解决方案
  • 悄悄地说一个bug
  • 如何编写一个可升级的智能合约
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 通信类
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 大数据全解:定义、价值及挑战
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • #includecmath
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #预处理和函数的对比以及条件编译
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • $nextTick的使用场景介绍
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏