Generator函数语法

  • 基础概念
    • *星号的位置
    • next方法的参数
    • tips

基础概念

  • Generator 函数是 ES6 提供的 种异步编程解决方案,语法行为与传统函数完全不同。
  • 执行 Generator 函数会返回 个遍历器对象 也就是说, Generator 函数除了是状态机,还是个遍历器对象生成函数
    返回的遍历器对象可以依次遍历 Generator 函数内部的每 个状态。
  • 形式上, Generator 函数是 个普通函数,但是有三个特征: function 命令与函数名之间有 个星号*: 二是函数体内部使用
    yield 吾句定义不同的内部状态(“ yield ”在英语里的意思就是“产出“);三是使得指针移向下 状态。也就是说, 每次调用
    next 方法,内指针就从函数头部或上 次停下来的地方开始执行 直到遇到下一条yield 语句(或 return 语句)为止 ;换言之
    Generator 函数是分段执行的; yield 语句是暂停执行的标记 ;next 方法可以恢复执行;
function* GeneratorExam() { yield ’hello1’; yield ’hello2’; return ’helloending’;
}
var suchAs = GeneratorExam() ;

上边代码定义了一个geerator函数 GeneratorExam ,内部有三个状态hello1,hello2,helloending(return语句会结束执行);

suchAs.next(); //{value:'hello1',done:false}suchAs.next(); //{value:'hello2',done:false}suchAs.next(); //{value:'helloending',done:true}suchAs.next(); //{value:undefined,done:true}

上边代码一共调用了四次next()方法

  • 第一次调用, Generator 函数开始执行; 直到遇到第 yield 语句为止 next 方法返回一个对象,它的 value
    属性就是当前 yield 吾句的值 hello1, done 属性的值 false 表示遍历还没有结束。

  • 第二次调用, Generator 函数从上次 yield 语句停下的地方, 一直执行到下 yield语句。next 方法返回的对象的
    value 属性就是当前 yield 语句的值hello2, done 属性false 表示遍历还没有结束。

  • 第三次调用, Generator 函数从上次 yield 语句停下的地方,一直执行到 return 语句( 如果没有 return 语句
    就执行到函数结束); next 方法返回的对象的 value 属性就是紧跟在 return 语句后面的表达式的值(如果没有 return
    吾句 value 属性的值为 undefined) done 属性的值 true 表示遍历己经结束。

  • 第四次调用,此时Generator函数已经运行完毕,next方法返回对象的value值为undefined,done为true,以后再调用这个方法,都是这个值。
    总结一下,调用Generator函数返回一个遍历器对象,代表generator函数的内部指针,以后每次调用遍历器对象的next()方法,就会返回一个有value和done两个属性的对象。value代表当前的内部状态的值,done代表遍历是否结束。

*星号的位置

ES6没有规定function关键字和函数名之间的*星号写在哪个位置,所以以下写法都能通过。

function * such (x , y) { }
function *such (x, y) {}
function* such (x, y) { }
function*such (x, y) {}

next方法的参数

yield 语句本身没有返回值,或者说总是返回 undefined next 方法可以带有 个参数,该参数会被当作上一条 yield 语句的返回值

function* f () {for(var i = O; true; i++ ){var reset = yield i; if(reset) {i = -1; }}
}
var g = f();g.next() // { value: 0, done: false }
g.next() // { value: 1, done: false }
g.next(true) // { value: 0, done : false}
  • 上面的代码先定义了 个可以无限运行的 Generator 函数 ,如果 next 方法没有参数,每 次运行到 yield 吾句时,变量
    reset 的值总是 undefined 。当 next 方法带有一个参数 true 时,当前的变量 reset 就被重置为这个参数(即
    true ),因而 会等于- ,下 轮循环就从- 开始递增。

  • 这个功能有很重要的语法意义 Generator 函数从暂停状态到恢复运行,其上下文状态 (context )是不变的 通过 next
    方法的参数就有办法在 Generator 函数开始运行后继续向函数 体内部注入值 也就是说,可以在
    Generator函数运行的不同阶段从外部向内部注入不同的值, 从而调整函数行为。

再看一个例子

function* foo (x) { var y = 2 * (yield (x + 1)); var z = yield (y / 3) ; return (x + y + z);
}
var a = foo(5);
a.next() //{value:6, done:false}
a.next () //{value:NaN, done:false}
a.next () //{value:NaN, done:true}
var b=foo(5);
b.next() //{value:6,done:false}
b.next(12) //{value:8,done:false}
b.next(13) //{value:42,done:true}
  • 上面的代码中,第二次运行 next 方法的时候不带参数,导致 y的值等于 *undefined (即NaN ),除以3 以后还是 NaN
    ,因此返回对象的 value 属性也等于 NaN,第三次运行 Next方法的时候不带参数 所以 等于 undefined ,返回对象的
    value 属性等于 + NaN + undefined, 为NaN。

  • 如果向口next 方法提供参数,返回结果就完全不一样了上面的代码第 次调用b的next 方法时,返回x+1的值6,第二次调用next()方法,将第一次yeild语句值设为12,因此y=24,返回y/3为8; 第三次调用next();将上一次yeild设置为13,因此z为13;x=5;y=24;return为42;

tips

  • 由于next方法的参数表示上一条yield的返回值,因此第一次使用next()方法传参时无效的;V8引擎直接忽略第一次next方法传参;
  • 当然如果想在第一次调用方法就能输入值,可以在Generator函数外面再包一层。
function wrapper(generatorFunction) { return function ( ... args) { let generatorObject = generatorFunction( ... args) ; generatorObject.next() ; return generatorObject;};
}const wrapped= wrapper(function* () { console.log(First put ${yield});return ’ DONE ’ ;
})
wrapped().next('hello!') //First put hello!

参考:
书籍:《ES6标准入门》;

Generator函数语法相关推荐

  1. php中reset()函数,php reset()函数 语法

    PHP reset() 函数 定义和用法 reset()函数把数组的内部指针指向第一个元素,并返回这个元素的值.若失败,则返回 FALSE. reset()函数用来将数组指针设置回数组的开始位置.如果 ...

  2. Generator函数的语法以及异步的应用

    基本概念 Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同.Generator函数有多种理解角度.语法上,首先可以把它理解成,Generator函数是一个状态机,封 ...

  3. “睡服”面试官系列第十八篇之generator函数的语法(建议收藏学习)

    目录 1简介 1.1基本概念 1.2yield 表达式 1.3与 Iterator 接口的关系 2. next 方法的参数 3. for...of 循环 4. Generator.prototype. ...

  4. ES6——Generator 函数的语法

    Generator 函数是一个状态机,封装了多个内部状态.执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机,还是一个遍历器对象生成函数.返回的遍历器对象 ...

  5. ES6学习(九)—Generator 函数的语法

    ES6学习(九)-Generator 函数的语法 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同. Generator函数是一个状态机,内部封装了不同状态的 ...

  6. ES6语法总结(21)--Generator函数的异步应用

    Generator 函数的异步应用 传统方法 基本概念 Generator 函数 Thunk 函数 co 模块 异步编程对 JavaScript 语言太重要.JavaScript 语言的执行环境是&q ...

  7. JavaScript 异步编程--Generator函数、async、await

    JavaScript 异步编程–Generator函数 Generator(生成器)是ES6标准引入的新的数据类型,其最大的特点就是可以交出函数的执行的控制权,即:通过yield关键字标明需要暂停的语 ...

  8. 【ES6】Generator函数详解

    [ES6]Generator函数详解 一.Generator函数简介 基本概念 函数写法 yield关键字介绍 二.next方法的参数 三.for...of循环 四.关于普通throw()与Gener ...

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

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

最新文章

  1. 你必须了解的微服务架构设计的10个要点!
  2. Android最佳性能实践(二)——分析内存的使用情况
  3. python圆柱体,用PYTHON将圆柱体分散到3D XYZ点数据
  4. QT关于全局变量的申请以及使用,所有class可用同一个变量
  5. host mysql server_解决服务器连接错误Host ‘XXX’ is not allowed to connect to this MySQL server...
  6. AI:2020年6月23日北京智源大会顶级大佬邝子平、李开复 、陆奇、张亚勤、曹勖文进行云上圆桌论坛《探讨AI与创业》
  7. DAS,NAS,SAN在数据库存储上的应用
  8. GatewayMetricsFilter网关度量过滤器(服务监控)
  9. 使用Amazon s3托管您的Maven工件
  10. editview只输入英文_搜狗输入法Mac版更新:适配苹果M1处理器
  11. [参考]查看ORACLE DB信息的一些SQL
  12. pil python 安装_Python实现识别人脸特征并打印出来!
  13. List增删元素后size大小发生变化带来的影响、Stream流操作、Lambda表达式
  14. 我读研期间通过实习和比赛收入五十万
  15. 拓端tecdat|python3用ARIMA模型进行时间序列预测
  16. 安装vray显示指定服务器没安装,Vray使用手册——安装常见问题
  17. VS2015卸载。非常干净-亲测有用
  18. java语言扫雷游戏的实验设计_java扫雷游戏计算机毕业设计中期检查表、中期报告.doc...
  19. 点击链接跳转到微信扫码二维码添加微信好友
  20. 乐优商城之后台管理系统

热门文章

  1. Echarts实现正弦曲线和散点图
  2. git push origin master报错的解决方法 常见git命令(待更新)
  3. 写完这段代码,就被开除了……
  4. 华为服务器raid5修复,服务器改raid5
  5. OpenAI教程之OpenAI 的 Dall-E2 令人印象深刻
  6. Oracle 内存结构
  7. 用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)
  8. 交友项目【查询好友动态,查询推荐动态】实现
  9. CVPR2021投稿流程
  10. linux 网络不可达 网卡,我的服务器日志中的linux – (网络不可达)错误