js中生成器函数的深入讲解
前言
Generator函数是es6提供的异步编程解决方案,其语法行为与传统函数完全不同。
有许多方法可以理解生成器功能。从语法上讲,可以理解为Generator函数是一个封装了几个内部状态的状态机。抓住
行生成器函数返回一个助行器对象,也就是说,生成器函数不仅是一个状态机,也是一个助行器对象生成函数。返回walker对象,该对象可以依次遍历生成器函数内部的每个状态。
下面就不多说了,我们来看看详细的介绍
从语法上讲,
首先可以理解,Generator函数是封装多个内部状态的状态机。执行Generator函数将返回一个测力计对象,也就是说,Generator函数不仅是一个状态机,也是一个测力计对象生成函数。返回的walker对象可以依次遍历生成器函数中的每个状态。
形式
生成器函数是一个普通函数,但它有两个特点。
首先,函数关键字和函数名之间有一个星号;第二,在函数体内使用yield这个表达式来定义不同的内部状态(yield在英语中的意思是“输出”)。
拜访
与普通函数一样,通过在函数名后添加一对括号来调用Generator函数。不同的是调用Generator函数后,函数不执行,返回指向内部状态的指针对象,也就是上一章介绍的Iterator对象。我们必须调用walker对象的下一个方法来将指针移动到下一个状态。也就是说,每次调用下一个方法时,内部指针都会从函数的头部或上次停止的地方开始执行,直到遇到下一个yield表达式(或return语句)。换句话说,Generator函数是分段执行的,yield表达式是暂停执行的标志,下一个方法可以恢复执行
函数* helloWorldGenerator(){ yield ' hello ';让出‘世界’;返回“ending”;} var HW=helloWorldGenerator();hw.next()//{ value: 'hello ',done : false } HW . next()//{ value : ' world ',done : false } HW . next()//{ value : ' ending ',done : true } HW . next()/{ value : undefined,done3360 true}调用Generator函数并返回一个traverse对象,该对象表示Generator函数的内部指针。将来,每次调用traverse对象的下一个方法时,都会返回一个具有两个属性的对象:value和done。value属性表示当前内部状态的值,即yield表达式之后的表达式的值;done属性是一个布尔值,指示遍历是否结束。
产量表达式
Yield表达式和return语句既有相似之处,也有不同之处。相似之处在于,它们都可以在语句之后立即返回表达式的值。不同的是,每次遇到yield时,函数都会暂停执行,下一次继续从该位置向后执行,而return语句没有位置内存的功能。在一个函数中,只能执行一个return语句,但可以执行多个yield表达式。普通函数只能返回值一个,因为return只能执行一次;生成器函数可以返回一系列值,因为可以有任意数量的产量。从另一个角度来看,也可以说generator生成了一系列的值,这就是它名字的由来(在英语中,Generator这个词的意思是“发电机”)。
语法注释:
1.1.yield表达式只能在生成器函数中使用
2.如果2.yield表达式用在另一个表达式中,它必须放在括号中
3.3.yield表达式可以用作函数参数,也可以放在赋值表达式的右侧,不带括号。
例如:
function * demo(){ foo(yield‘a’,yield‘b’);//OK让输入=产量;//确定}下一个方法的参数
yield表达式本身没有返回值(即让a=yield将返回undefined),或者总是返回undefined。下一个方法可以取一个参数,该参数将被视为上一个yield表达式的返回值(注意,它是表达式的返回值,例如,让a=yield..参数将是的值,并将重写表达式之前的值)。
函数* f(){ for(var I=0;真的;i ) { var reset=收益率I;console.log(重置);if(reset){ I=-1;} } } var g=f();g . next()
由于下一个方法的参数表示前一个yield表达式的返回值,因此第一次使用下一个方法时,传递的参数无效。V8引擎在第一次使用下一个方法时直接忽略参数,第二次使用下一个方法后参数才有效。从语义上讲,第一个next方法是用来启动walker对象的,所以不需要带参数。
摘要
以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。谢谢你的支持。
版权声明:js中生成器函数的深入讲解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。