JS 中的 generator (生成器)和 Python 中的很相似。

  一个generator看上去像一个函数,但可以返回多次。与函数不同的是,generatorfunction*定义(注意多出的*号),并且,除了return语句,还可以用yield返回多次。

比如用 generator 写一个生成斐波那契数列的函数:

function* fib(max) {vart,a = 0,b = 1,n = 0;while (n < max) {yield a;[a, b] = [b, a + b];n ++;}return;
}var f = fib(5);   //这里调用了fib函数,但只是创建了一个generator对象,而不是调用它

调用generator对象有两个方法,一是不断地调用generator对象的next()方法

f.next(); // {value: 0, done: false}
f.next(); // {value: 1, done: false}
f.next(); // {value: 1, done: false}
f.next(); // {value: 2, done: false}
f.next(); // {value: 3, done: false}
f.next(); // {value: undefined, done: true}

  next()方法会执行generator的代码,然后,每次遇到yield x就返回一个对象{value: x, done: true/false},然后“暂停”。

  每次调用 next 方法时,程序会回到上次 yield 返回的地方,然后继续执行代码,且代码中的上下文环境会被保存下来,如 a,b,n 这几个变量就是上次代码执行的结果。

  返回的value就是yield的返回值,done表示这个generator是否已经执行结束了。如果donetrue,则value就是return的返回值。

  当执行到donetrue时,这个generator对象就已经全部执行完毕,不要再继续调用next()了。

  第二个方法是直接用for ... of循环迭代generator对象,这种方式不需要我们自己判断done

for (var x of fib(10)) {console.log(x); // 依次输出0, 1, 1, 2, 3, ...
}

来源:https://www.liaoxuefeng.com/wiki/1022910821149312/1023024381818112

JS中的 generator相关推荐

  1. js中的generator

    generator(生成器)是ES6标准引入的新的数据类型.一个generator看上去像一个函数,但可以返回多次. ES6定义generator标准的哥们借鉴了Python的generator的概念 ...

  2. JS中的Generator函数

    Generator 函数是 ES6 提供的一种异步编程解决方案,它是一个状态机,封装了多个内部状态:它提供一种有效的方式来制作迭代器,并且能够处理无限数据流:当与Promises一起使用时,生成器可以 ...

  3. js中的yield、yield*和Generator函数

    基本概念 yield和yield*都是js中的关键字,他们不能直接使用:只能配合Generator进行使用:Generator是一种函数,声明方式和普通函数类似,只不过要在function后面加个*( ...

  4. es6 中的generator函数控制流程

    Generator函数跟普通函数的写法有非常大的区别: 一是,function关键字与函数名之间有一个星号: 二是,函数体内部使用yield语句,定义不同的内部状态(yield在英语里的意思就是&qu ...

  5. 掌握Node.js中的Async和Await

    在本文中,你将学习如何使用Node.js中的async函数(async/await)来简化callback或Promise. 异步语言结构在其他语言中已经存在了,像c#的async/await.Kot ...

  6. 【温故知新】——原生js中常用的四种循环方式

    一.引言 本文主要是利用一个例子,讲一下原生js中常用的四种循环方式的使用与区别: 实现效果: 在网页中弹出框输入0   网页输出"欢迎下次光临" 在网页中弹出框输入1   网页输 ...

  7. Js中函数式编程的理解

    函数式编程的理解 函数式编程是一种编程范式,可以理解为是利用函数把运算过程封装起来,通过组合各种函数来计算结果.函数式编程与命令式编程最大的不同其实在于,函数式编程关心数据的映射,命令式编程关心解决问 ...

  8. Js中Currying的应用

    Js中Currying的应用 柯里化Currying是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术,是函数式编程应用. 描述 如果说函数式编程中有两 ...

  9. 小白必看!JS中循环语句大集合

    摘要:JavaScript中,一共给开发者提供了一下几种循环语句,分别是while循环,do-while循环,for循环,for Each,for-in循环和for-of循环. 本文分享自华为云社区& ...

最新文章

  1. 和 VMware、深信服、天翼云、招商云专家一起聊聊云原生边缘计算
  2. Scala模式匹配中的变量
  3. 报错 之 ModuleNotFoundError: No module named ‘setproctitle‘
  4. javaScript今日总结
  5. xml格式的word转为标准格式_保持的怎么保证Word格式不变?4个技巧需要带走
  6. PHP JAVA BASE64 encode decode
  7. PrefTest性能测试解决方案 -- C/S结构应用系统的压力测试
  8. 传智播客java测试题_传智播客java考试习题3
  9. C#开发工控上位机编程 csdn_C#联合WINCC之数据通信
  10. 正则表达式小Tips
  11. DarkComet Analysis – Understanding the Trojan used in Syrian Uprising
  12. 基于aircrack-ng、crunch的wifi握手包爆破
  13. IDEA 运行 springboot运行出现 错误: 找不到或无法加载主类和找不到资源文件类
  14. sybase客户端SqlDbx中文乱码问题解决
  15. UniAPP离线车牌实时扫描识别
  16. HTML如何做一张李白的静夜思,李白《静夜思》配图赏析
  17. 移动宽带安装说明一(刘欣)
  18. 捕获窗口跳入跳出事件
  19. 沁恒触摸蓝牙模块方案测试体验(CH582)
  20. 【IoT】产品设计之行业动态:社区团购:巨头们会放弃卖菜这门生意吗?

热门文章

  1. 曾因出演《西游记》爆红,现在转行写代码身价过亿!不一样的CTO!
  2. 活久见!64 张图带你 Maven 实战通关
  3. 总监说,20、30岁年轻人面临人生抉择,早点知道这个法则,会少一些遗憾!
  4. Java 的序列化和反序列化,你该知道得更多
  5. 初探性能优化--2个月到4小时的性能提升!
  6. 这里有最全的k8s初学者指南!!!
  7. 与其羡慕他人精彩,还不如设法活出自我
  8. 为什么很多程序员工作时都戴耳机?
  9. PingCode 是用来干嘛的?
  10. 一个研发团队是如何坚持7年技术分享的?