加入收藏 | 设为首页 | 会员中心 | 我要投稿 信阳站长网 (https://www.0376zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

Javascript生成器是什么?生成器用法详解

发布时间:2022-03-24 14:22:05 所属栏目:语言 来源:互联网
导读:Javascript生成器是什么?对于新手来说,可能对Javascript生成器比较陌生,因此这篇文章就给大家介绍一下Javascript生成器的概念以及用法。感兴趣的朋友就往下看吧。 什么是生成器? 生成器是在函数内部运行的一些代码 返回值后,它会自行暂停,并且―― 调
      Javascript生成器是什么?对于新手来说,可能对Javascript生成器比较陌生,因此这篇文章就给大家介绍一下Javascript生成器的概念以及用法。感兴趣的朋友就往下看吧。
 
        什么是生成器?
        生成器是在函数内部运行的一些代码
 
返回值后,它会自行暂停,并且――
调用程序可以要求取消暂停并返回另一个值
        这种“返回”不是传统的从函数 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 的任何调用都会返回一个对象,该对象的值为 undefined 且done 设置为 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)
}

(编辑:信阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读