ES6——迭代器

74 阅读2分钟

​​持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

迭代器是什么?

迭代器是一种特殊对象,它具有一些专门为迭代过程设计的专有接口 主要为for…of…服务

为什么要有它? 由于原用for循环 如果需要循环嵌套 代码复杂度会上升 方便数据结构进行自定义遍历 一些数据原生(本来就有)具备itervator 任何数据结构只要部署了itervator都可以进行遍历操作

  生成器一般用于解决回调地狱

*生成器写法:function (){} 

  1. 函数名前面有一个 *****
  2. 调用next()方法开始执行函数
  3. yield为暂停

yield 它有两个属性,value和done,分别代表返回值和是否完成。

使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return关键字

例:

function * gen(){
    console.log('My name is NanChen');
}
let iterator = gen()
iterator.next()    //开始执行

打印效果:

 例2:

<script>
        function * gen() {
            console.log('--- 1 ---');
            yield 'eye'        // 使生成器函数执行暂停
            console.log('--- 2 ---');
            yield 'nose'
            console.log('--- 3 ---');
            yield 'head'
        }
        for(let item of gen()){
            console.log(item);
        }
</script>

打印效果:

 回调地狱:经常因为某些逻辑导致写出一层嵌套一层的回调函数,如果嵌套的很多,将会极大的影响到代码逻辑和可读性,这种代码就被成为回调地狱。

例:

setTimeout(() => {
    console.log(111)
    setTimeout(() => {
        console.log(222)
        setTimeout(() => {
            console.log(333)
        }, 3000)
    }, 2000)
}, 1000)

解决方法:把每层嵌套单独拿出来

	function one(){
                        setTimeout(()=>{
                            console.log('111');
                            iterator.next()
                        },1000)
			}
			function two(){
				setTimeout(()=>{
					console.log('222');
					iterator.next()
				},2000)
			}
			function three(){
				setTimeout(()=>{
					console.log('333');	
				},3000)
			}
			function * gen(){
				yield one()
				yield two()
				yield three()
			}
			let iterator = gen()
			iterator.next()

实现效果如下图: