前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaScript生成器

JavaScript生成器

作者头像
大熊G
发布2022-11-14 16:46:28
5070
发布2022-11-14 16:46:28
举报

theme: channing-cyan

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

什么是生成器

生成器是ES6新出的一种特殊的函数,调用之后会返回一个生成器对象,它实现了Iterable接口,因此可以用在任何可迭代对象身上,生成器的独特之处就是支持yield,yield可以暂停执行的生成器函数,还可以通过next()方法接受输入和产生输出,在关键字加上 * 号后还可以将跟着它后面的可迭代对象序列化为一连串值。

如何定义生成器

在函数名称前加一个 * 号就表示它是一个生成器,只要是可以定义函数,就可以定义生成器

代码语言:javascript
复制
      // 生成器函数声明
       function* generatorFn() {}
       // 生成器函数表达式
       let generatorFn = function* () {}
       // 作为对象字面量方法的生成器函数
       let foo = {
           * generatorFn() {}
       }
       // 作为类实例方法的生成器函数
       class Foo {
           * generatorFn() {}
       }
       // 作为类静态方法的生成器函数
       class Bar {
           static * generatorFn() {}
       }

注意:箭头函数不能用来定义生成器

生成器一开始处于暂停执行的状态(suspended),生成器也实现了iterator接口,同样也可以调用next()方法,调用这个方法会让生成器开始或恢复执行

代码语言:javascript
复制
        function * generatorFn(){};
        const f = generatorFn();
        console.log(f,f.next());
        //generatorFn {<closed>} Window {value: undefined, done: true}

使用yield中断执行

生成器在遇到yield关键字之前会正常执行,遇到这个关键字后会停止执行,函数的作用域状态会被保留,如果停止了还需要调用next()方法来恢复执行

代码语言:javascript
复制
        function * generatorFn(){
            yield;
        };
        const f = generatorFn();
        console.log(f.next()); //{value: undefined, done: false}
        console.log(f.next()); //{value: undefined, done: true}

yield生成的值会出现在next()方法里,通过yield退出的生成器函数会处在 done:false状态,通过retutn退出的生成器会处于 done :true状态

代码语言:javascript
复制
        function * generatorFn(){
             yield 'jackson';
            return 'bear';
        };
        const f = generatorFn();
        console.log(f.next()); //{value: "jackson", done: false}
        console.log(f.next()); //{value: "bear", done: true}

yield 关键字的优先级很低,yield 之后的表达式基本上都要优先计算,只有 spread(展开运算符) 运算符和逗号运算符的优先级比它低。

生成器可以作为默认迭代器

因为生成器哦对象实现了Iterable接口,而且生成器和默认迭代器被调用之后都可以产生迭代器,所以生成器格外适合作为默认迭代器

代码语言:javascript
复制
       class Foo {
            constructor() {
                    this.values = ['jackson', 'bear'];
                }
                *[Symbol.iterator]() {
                    yield* this.values;
                }
        }
        const f = new Foo();
        for (const x of f) {
            console.log(x);
        }
        // jackson 
        // bear

提前终止生成器

  1. return() return()方法会强制生成器进入关闭状态。提供给 return()方法的值,就是终止迭代器对象的值

与迭代器不同,所有生成器对象都有return()方法,只要通过它进入关闭状态,就无法恢复了。 后续调用 next()会显示 done: true 状态,而提供的任何返回值都不会被存储或传播:

  1. throw() throw()方法会在暂停的时候将一个提供的错误注入到生成器对象中。如果错误未被处理,生成器就会关闭

注意 如果生成器对象还没有开始执行,那么调用 throw()抛出的错误不会在函数内部被捕获,因为这相当于在函数块外部抛出了错误

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • theme: channing-cyan
  • 什么是生成器
    • 如何定义生成器
      • 使用yield中断执行
        • 生成器可以作为默认迭代器
          • 提前终止生成器
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档