day87-生成器迭代器

前言

生成器实现day86中的something无限数字序列生产者

Photo by Paulin Malet on Unsplash
Photo by Paulin Malet on Unsplash

实现生产者

function *something() {
let nextVal
while (true) {
if (nextVal === undefined) {
nextVal = 1
} else {
nextVal = (3 * nextVal) + 6
}
// 生成器在每次迭代中暂停.
// 通过yield返回到主程序或事件循环队列中。
// --函数*something()的作用域会被保持(即不需要闭包在调用直接保持变量作用域)
yield nextVal
}
}

应用

for…of循环使用*something()生成器

注意这里是something()而不是something。因为这里something是生成器不是迭代器。
something()调用产生一个迭代器,但是for…of需要一个iterable(可迭代:一个包含在其值上迭代的迭代器的对象)。
这是因为生成器的迭代器也有一个Symbol.iterator函数,而这个函数做的就是return this,
和之前迭代器里定义的iterable something一样,即生成器的迭代器也是一个iterable(可迭代)。

for (let v of something()) {
console.log(v)
// 不要死循环
if (v > 500) {
break
}
}
// 1 9 33 105 321 969
文章作者: lmislm
文章链接: http://lmislm.com/2019/04/08/2019-04-08/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LMISLMのBlog