ES6 Generator函数

288 阅读3分钟

1.基本概念: Generator函数是ES6提供的一种异步编程解决方案. (1) 语法上是状态机,封装多个内部状态; 也是遍历器对象生成函数, 执行后返回遍历器对象。
(2) 形式上是一个普通函数,但需星号标识区分; 函数体内部可使用yield语句,定义不同的状态; 调用后并不执行(暂缓执行),返回遍历器对象(指针对象)

  1. yield语句: yield语句是暂停标志, 执行next方法逻辑 (1)遇到yield就暂停执行,并将紧跟yield后的表达式值作为返回对象value属性值。 (2)再次调用next方法时,继续往下执行,直到遇到下一个yield语句。 (3)如没再遇到新的yield语句,就一直运行到函数结束,直到return语句为止,并将return语句后表达式值作为返回对象value属性值。 (4)如该函数没有return语句,则返回对象value属性值为undefined。 注: yield后面的表达式,只有当调用next方法、内部指针指向该语句时才会执行,因此等于为JavaScript提供了手动的“惰性求值”语法功能。yield语句不能用在普通函数中会报错。

  2. yield与return语句 相同处: 都返回紧跟在语句后的表达式值作为value属性值。 不同处: * 每次遇到yield,函数暂停执行,下一次再从该位置继续向后执行; return不具备位置记忆功能, next后 后面代码不在执行。 * 一个函数里面,只能执行一次return,但可执行多次yield。 Generator函数可不用yield语句,这时就变成了一个单纯的暂缓执行函数。

  3. 与Iterator接口关系 任意对象的Symbol.iterator方法,等于该对象遍历器生成函数; 因此可把Generator赋值给对象Symbol.iterator属性,从而使得该对象具有Iterator接口。

Generator函数执行后返回一个遍历器对象。该遍历器对象也具有Symbol.iterator属性,执行后返回遍历器对象自身。

5.next方法参数 yield本身没有值(或总为undefined)。next方法可传一个参数,作为上一个yield语句的返回值。yield后的表达式只是作为对外返回的对象value属性值。 意义:Generator函数从暂停状态到恢复运行的不同阶段,通过next方法的参数从外部向内部注入不同的值,改变函数上下文状态从而调整函数行为。

注: next参数表示上一个yield语句的返回值,所以第一次使用next方法时,不能带有参数。V8引擎忽略第一次的参数,只有从第二次使用next方法开始,参数才是有效的。从语义上第一个next方法用来启动遍历器对象,所以不用带有参数。

6.for...of: 可自动遍历Generator函数时生成的Iterator对象,不需要调用next方法。

7.Generator.prototype.throw(): throw() 是原型链上的方法,所有每个Generator函数实例对象都有该方法。

8.Generator.prototype.return()

9.yield*语句: 在Generater函数内部,调用另一个Generator函数(多维数组降为一维数组);