扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
小编给大家分享一下Javascript中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
的任何调用都会返回一个对象,该对象的值为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) }
当在for...of
循环中使用生成器对象时,每次循环都会在生成器对象上调用next
,并用产生的值填充变量(上面的value
)。运行该程序将会输出以下内容:
$ node sample-program.js 0 1 2 3 4
以上是“Javascript中Generator生成器有什么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流