百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>JS教程> 详解Javascript中的Generator生成器
分享文章到:

详解Javascript中的Generator生成器

发布时间:01/01 来源:未知 浏览: 关键词:

什么是Generator生成器?

生成器是在函数内部运转的一些代码

  • 返回值后,它会自行暂停,并且——

  • 调取程序可以要求取消暂停并返回另一个值

这种“返回”不是传统的从函数 return。所以它被给予了一个非凡的名称——yield

生成器语法因说话而异。 Javascript 的生成器语法相似于 PHP,但是不同也很大,假如你但愿它们的作用雷同,那么终究你会感到非常困惑。

在 javascript 中,假如想要使用生成器,则需要:

  • 定义非凡的生成器函数

  • 调取该函数创立一个生成器对象

  • 在轮回中使用该生成器对象,或直接调取其 next 办法

我们以下面这个简便的程序做为起点,并施行以下每个步骤:

// File: sample-program.js
function *createGenerator() {
  for(let i=0;i<20;i++) {
    yield i
  }
}

const generator = createGenerator()

console.log(generator.next())
console.log(generator.next())

假如运转这段代码,则会得到以下输出:

$ node sample-program.js

{ value: 0, done: false }
{ value: 1, done: false }

下面我来说明该程序是怎样工作的。

生成器函数

第一,代码中存在生成器函数的定义:

function* createGenerator() {
  for(let i=0;i<20;i++) {
    yield i
  }
}

function 后面的 * 告诉 javascript 这是一个生成器函数。以下写法都是生成器函数的有效定义。

function*createGenerator
function* createGenerator
function *createGenerator

*不是函数名的一部分。而是 function* 符号定义了生成器。

调取生成器函数

定义了生成器函数后,我们将其命名为其他名称的函数。

// 留意:当调取时,没有 *。 * 不是函数名称的一部分
// `function *` 是用于定义生成器函数的符号
const generator = createGenerator()

但是要记住:createGenerator 函数没有返回值。这是由于生成器函数没有传统的返回值。相反,当你直接调取生成器函数时,它总是返回实例化的 Generator 对象。

这个生成器对象具有一个 next 办法。调取 next 将在生成器函数内部运转代码。

function* createGenerator() {
    for(let i=0;i<20;i++) {
        yield i
    }
}

这很重要,足以再次调取它。直接调取生成器函数不会在生成器函数中运转任何代码。而是创立一个生成器对象。它在生成器对象上调取 next,从而调取生成器函数中的代码。

首次在生成器对象上调取 next 时,内部代码将会不断运转,直到显现 yield 语句。一旦施行到 yield,javascript 将会暂停该代码的施行,而 next 将返回(即给你,或yield)一个对象,该对象包括 yield 行中的值。

当你第二次(或第三次、第四次乃至更屡次)再调取 next 时,代码将会取消暂停并连续运转(在上次调取时中止的地方)。变量(例如本例中的 i )将会保持它的值。今世码抵达另一个 yield 语句时,该函数会再次暂停,并返回一个包括 yield 值的对象。

这就是为什么我们要调取两次 next

console.log(generator.next())
console.log(generator.next())

会得到以下输出:

{ value: 0, done: false }
{ value: 1, done: false }

生成器函数中的代码施行完毕后,未来对 next 的任何调取都会返回一个对象,该对象的值为 undefineddone 设定为 true

{ value: undefined, done: true }

生成器和轮回

虽然可以在生成器对象上手动调取 next,但我们主如果要在轮回中使用。看一下这个稍作修改的程序。

// File: sample-program.js
@highlightsyntax@jscript
function *createGenerator() {
  for(let i=0;i<5;i++) {
    yield i
  }
}

const generator = createGenerator()
for(const value of generator) {
  console.log(value)
}

当在 for...of 轮回中使用生成器对象时,每次轮回都会在生成器对象上调取 next,并用发生的值填充变量(上面的 value)。运转该程序将会输出以下内容:

$ node sample-program.js
0
1
2
3
4

鄙人一篇文章中,我们将更深入地商量 for ... of 轮回,并摸索怎样为 javascript 供给一种内置办法来轮回 javascript 中的任何对象

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有152人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板