1.
任意一个对象的Symbol.iterator
方法,等于该对象的遍历器生成函数,调用该函数会返回该对象的一个遍历器对象。
所以a[Symbol.iterator]().next()方法等于a的next()方法,所以执行generator函数生成的对象也是可以遍历的,可以使用扩展运算符和for of
额外:
对象有 for in方法 没有for of方法,for of方法需要对象实现iterator方法
对象iterator方法简单实现:
使用generator实现对象的iterator
调用普通函数函数体会直接执行,而generator函数调用了next()方法,函数体才会真正执行
3.yield
next()能传参数,参数为yield右边表达式的值,generator生成的迭代器每执行一次next(),都会返回一个带有键value和done的对象,执行next()会执行这次yield右边的语句,然后停在此yield处,返回的的value值为yield右边式子的值,done为false代表下面还有yield可以执行。
next()参数是给上一次yield赋值
4.
如果想第一次执行就取得yield的值可以在使用闭包。
闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
5.throw
throw
方法抛出的错误要被内部捕获,前提是必须至少执行过一次next
方法。
throw抛出错误后会执行下一次yield后代码
如果generator函数内部没有捕获,那么相当于generator函数执行完毕,返回一个{value:undefined,done:true}的对象
6.return
return函数导致generator停止遍历,value值为return传递的值,如果没有传值便为undifined,如果try catch捕获后有finally语句,不会终止,可以继续next(),但是最后完成状态的值为return传入的值
next()
、throw()
、return()
这三个方法本质上是同一件事,可以放在一起理解。它们的作用都是让 Generator 函数恢复执行,并且使用不同的语句替换yield
表达式。
generator函数内部也可以使用return语句,并且只有第一个return语句会生效,如同外部迭代器对象调用return一样,返回一个done为true的对象,表示遍历完成了,再调用next(),返回的value都为undefined。
6.yield * 能将一个带有迭代器的对象遍历并且带有yield
obj是实现了迭代器的对象
7.状态机
8.thunk函数就是将一个多参数的函数转化为一个只接受回调函数作为参数的单参数函数。
以下为实现自动执行器之前的铺垫
自动执行器:
9.co模块 npm i co
然后co(generator函数)就可以自动执行generator函数