在js中函数一旦运行,会运行到最后,或者遇到retuen 的时候。而generator函数打破了函数完成运行的可能。它的语法跟普通函数完全不同。
1:function关键字和函数型之间有个*号,推荐放在关键字后面。
2:直接调用 Generator函数并不会执行,也不会返回运行结果,而是返回一个遍历器对象(Iterator Object)
3: 依次调用遍历器对象的next方法,遍历 Generator函数内部的每一个状态
4:体现了惰性,走一步停一步,yield是暂停 ,next()继续。
5:yield跟return的区别:相似之处都是返回了表达式的值,区别,每次遇到yield就会暂停执行,调用next之后再从该位置继续向后执行,而return语句执行完,函数也就执行完毕。一个函数只能执行一次return ,而生成器函数可以左右多个yield。因此再生成器函数中可以不必要return。
6:任何具有有效的[Symnol.iterator]接口的对象都是可迭代的,可以使用for of 遍历。for of 实际上调用的就是next方法。一旦next()方法发挥的对象的属性的done是true,for of循环就是终止。且不包含该返回对象。
function* gen() { yield 1 yield 2 yield 3 yield 4 return 5 } for(let item of gen()) { console.log(item) } // 1 2 3 4
7:生成器函数如果有return params,则最后的执行结果是{value:params,done:true},否则是 {value:undefined,done:true}