前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Generator 函数的语法

Generator 函数的语法

原创
作者头像
李才哥
修改2021-02-24 17:55:22
4010
修改2021-02-24 17:55:22
举报
文章被收录于专栏:李才哥

Generator 函数的语法

简介

Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同

语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态

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

一是,function关键字与函数名之间有一个星号

二是,函数体内部使用yield表达式,定义不同的内部状态

总结一下,调用 Generator 函数,返回一个遍历器对象,代表 Generator 函数的内部指针。以后,每次调用遍历器对象的next方法,就会返回一个有着value和done两个属性的对象

next 方法的参数

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

由于next方法的参数表示上一个yield表达式的返回值,所以在第一次使用next方法时,传递参数是无效的

如果想要第一次调用next方法时,就能够输入值,可以在 Generator 函数外面再包一层

for...of 循环

for...of循环可以自动遍历 Generator 函数时生成的Iterator对象,且此时不再需要调用next方法

利用for...of循环,可以写出遍历任意对象(object)的方法

Generator.prototype.throw()

Generator 函数返回的遍历器对象,都有一个throw方法,可以在函数体外抛出错误,然后在 Generator 函数体内捕获

不要混淆遍历器对象的throw方法和全局的throw命令

throw方法抛出的错误要被内部捕获,前提是必须至少执行过一次next方法

Generator.prototype.return()

Generator 函数返回的遍历器对象,还有一个return方法,可以返回给定的值,并且终结遍历 Generator 函数

如果return方法调用时,不提供参数,则返回值的value属性为undefined

Generator 函数内部有try...finally代码块,那么return方法会推迟到finally代码块执行完再执行

next()、throw()、return() 的共同点

它们的作用都是让 Generator 函数恢复执行,并且使用不同的语句替换yield表达式

next()是将yield表达式替换成一个值。

throw()是将yield表达式替换成一个throw语句

return()是将yield表达式替换成一个return语句

yield* 表达式

如果在 Generator 函数内部,调用另一个 Generator 函数,默认情况下是没有效果的

用到yield*表达式,用来在一个 Generator 函数里面执行另一个 Generator 函数

任何数据结构只要有 Iterator 接口,就可以被yield*遍历

作为对象属性的 Generator 函数

属性前面有一个星号,表示这个属性是一个 Generator 函数

Generator 函数的this

Generator 函数也不能跟new命令一起用,会报错

生成一个空对象,使用call方法绑定 Generator 函数内部的this

构造函数调用以后,这个空对象就是 Generator 函数的实例对象了

含义

Generator 是实现状态机的最佳结构

。Generator 函数被称为“半协程”(semi-coroutine),意思是只有 Generator 函数的调用者,才能将程序的执行权还给 Generator 函数

Generator 执行产生的上下文环境,一旦遇到yield命令,就会暂时退出堆栈,但是并不消失,里面的所有变量和对象会冻结在当前状态

应用

Generator 可以暂停函数执行,返回任意表达式的值

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
    • Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同
      • 语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态
        • 执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机,还是一个遍历器对象生成函数
          • 一是,function关键字与函数名之间有一个星号
            • 二是,函数体内部使用yield表达式,定义不同的内部状态
              • 总结一下,调用 Generator 函数,返回一个遍历器对象,代表 Generator 函数的内部指针。以后,每次调用遍历器对象的next方法,就会返回一个有着value和done两个属性的对象
              • next 方法的参数
                • yield表达式本身没有返回值,或者说总是返回undefined。next方法可以带一个参数,该参数就会被当作上一个yield表达式的返回值
                  • 由于next方法的参数表示上一个yield表达式的返回值,所以在第一次使用next方法时,传递参数是无效的
                    • 如果想要第一次调用next方法时,就能够输入值,可以在 Generator 函数外面再包一层
                    • for...of 循环
                      • for...of循环可以自动遍历 Generator 函数时生成的Iterator对象,且此时不再需要调用next方法
                        • 利用for...of循环,可以写出遍历任意对象(object)的方法
                        • Generator.prototype.throw()
                          • Generator 函数返回的遍历器对象,都有一个throw方法,可以在函数体外抛出错误,然后在 Generator 函数体内捕获
                            • 不要混淆遍历器对象的throw方法和全局的throw命令
                              • throw方法抛出的错误要被内部捕获,前提是必须至少执行过一次next方法
                              • Generator.prototype.return()
                                • Generator 函数返回的遍历器对象,还有一个return方法,可以返回给定的值,并且终结遍历 Generator 函数
                                  • 如果return方法调用时,不提供参数,则返回值的value属性为undefined
                                    • Generator 函数内部有try...finally代码块,那么return方法会推迟到finally代码块执行完再执行
                                    • next()、throw()、return() 的共同点
                                      • 它们的作用都是让 Generator 函数恢复执行,并且使用不同的语句替换yield表达式
                                        • next()是将yield表达式替换成一个值。
                                          • throw()是将yield表达式替换成一个throw语句
                                            • return()是将yield表达式替换成一个return语句
                                            • yield* 表达式
                                              • 如果在 Generator 函数内部,调用另一个 Generator 函数,默认情况下是没有效果的
                                                • 用到yield*表达式,用来在一个 Generator 函数里面执行另一个 Generator 函数
                                                  • 任何数据结构只要有 Iterator 接口,就可以被yield*遍历
                                                  • 作为对象属性的 Generator 函数
                                                    • 属性前面有一个星号,表示这个属性是一个 Generator 函数
                                                    • Generator 函数的this
                                                      • Generator 函数也不能跟new命令一起用,会报错
                                                        • 生成一个空对象,使用call方法绑定 Generator 函数内部的this
                                                        • 含义
                                                          • Generator 是实现状态机的最佳结构
                                                            • 。Generator 函数被称为“半协程”(semi-coroutine),意思是只有 Generator 函数的调用者,才能将程序的执行权还给 Generator 函数
                                                              • Generator 执行产生的上下文环境,一旦遇到yield命令,就会暂时退出堆栈,但是并不消失,里面的所有变量和对象会冻结在当前状态
                                                              • 应用
                                                                • Generator 可以暂停函数执行,返回任意表达式的值
                                                                领券
                                                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档