1。Generator简介Generator函数的基本概念有多个理解角度。从语法上,可以理解为Generator函数是一个封装了多个内部状态的状态机。执行Generator函数会返回一个遍历器对象,也就是说Generator函数不仅是一个状态机,还是一个遍历器对象生成函数。返回的遍历器对象可以依次遍历Generator函数内部的各个状态。形式上,Generator函数是一个普通函数,但具有两个特征。一种是函数命令和函数名之间有一个星号;另一种是在函数体内使用yield语句来定义不同的内部状态(yield语句在英文中是“输出”的意思)。'usestrict';function*helloWorldGenerator(){yield'hello';产生“世界”;return'ending';}lethw=helloWorldGenerator();上面的代码定义了一个Generator函数helloWorldGenerator,在hello和world中有两条yield语句,即函数有三种状态:hello、world和return语句(结束执行)。然后,Generator函数的调用方式和普通函数一样,在函数名后加一对括号。不同的是Generator函数调用后,函数并没有执行,返回的不是函数运行的结果,而是一个指向内部状态的指针对象,一个迭代器对象(IteratorObject)。2、next方法调用遍历器对象的next方法将指针移动到下一个状态。也就是说,每次调用next方法时,内部指针都从函数头或上次停止的地方开始执行,直到遇到下一个yield语句(或return语句)。也就是说,Generator函数是分段执行的,yield语句是一个暂停执行的标记,next方法可以恢复执行。hw.next()//{value:'hello',done:false}hw.next()//{value:'world',done:false}hw.next()//{value:'ending',done:true}hw.next()//{value:undefined,done:true}上面的代码一共调用了四次next方法。第一次调用时,Generator函数开始执行,直到遇到第一个yield语句。next方法返回一个对象,它的value属性是当前yield语句的valuehello,done属性的值为false,表示遍历还没有结束。第二次调用,Generator函数从上一个yield语句停止的地方开始执行,直到下一个yield语句。next方法返回的对象的value属性为当前yield语句的valueworld,done属性的值为false,表示遍历还没有结束。第三次调用,Generator函数从上一个yield语句停止的地方开始执行,直到return语句(如果没有return语句,则执行到函数结束)。next方法返回的对象的value属性是紧跟在return语句后面的表达式的值(如果没有return语句,value属性的值为undefined),done属性的值为true,表示遍历结束。第四次调用,当Generator函数运行完毕,next方法返回的对象的value属性为undefined,done属性为true。稍后调用next方法将返回此值。综上所述,调用Generator函数返回一个遍历器对象,表示Generator函数的内部指针。以后每次调用遍历器对象的next方法,都会返回一个有两个属性value和done的对象。value属性表示当前内部状态的值,也就是yield语句后面的表达式的值;done属性是一个布尔值,表示遍历是否结束。3.yield*语句用于在一个Generator函数中执行另一个Generator函数,我们需要使用yield*语句。如果yield命令后跟一个遍历器对象,则需要在yield命令后加一个星号,表示返回的是一个遍历器对象。这称为yield*语句。'usestrict';function*anotherGenerator(i){yieldi+1;产量i+2;yieldi+3;}function*generator(i){yieldi;yield*anotherGenerator(i);产量i+10;}letgen=generator(10);console.log(gen.next().value);//10console.log(gen.next().value);//11console.log(gen.next().value));//12console.log(gen.next().value);//13console.log(gen.next().value);//20console.log(gen.next().value);//undefined运行结果是使用一个遍历器遍历多个Generator函数,具有递归作用。
