这篇文章给大家介绍JavaScript中发电机函数如何使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
发电机函数是es6提供的一种异步编程的解决方案,语法行为与传统函数完全不一样。
发电机函数有多种理解角度,从语法上,首先可以把它理解成,发电机函数是一个状态机,封装了多个内部状态。
执
行发电机函数会返回一个遍历器对象,也就是说,发电机函数除了是状态机还是一个遍历器对象生成函数。返回遍历器对象,可以依次遍历发电机函数内部的每一个状态。
下面话不多说了,来一起看看详细的介绍吧
<强>语法上强>
首先可以把它理解成,发电机函数是一个状态机,封装了多个内部状态。执行发电机函数会返回一个遍历器对象,也就是说,发电机函数除了状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历发电机函数内部的每一个状态。
<强>形式上强>
发电机函数是一个普通函数,但是有两个特征。
,一是,函数关键字与函数名之间有一个星号;
引用>
,二是,函数体内部使用产量表达式,定义不同的内部状态(收益率在英语里的意思就是“产出”)。
<强>调用上强>
发电机函数的调用方法与普通函数一样,也是在函数名后面加上一对圆括号。不同的是,调用发电机函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象,也就是上一章介绍的遍历器对象(迭代器对象)。我们必须调用遍历器对象的一方法,使得指针移向下一个状态。也就是说,每次调用一方法,内部指针就从函数头部或上一次停下来的地方开始执行,直到遇到下一个收益表达式(或返回语句)为止。换言之,发电机函数是分段执行的,收益表达式是暂停执行的标记,而下一方法可以恢复执行
函数*,helloWorldGenerator (), { ,油品收率& # 39;你好# 39;; ,油品收率& # 39;& # 39;; ,return & # 39;结束# 39;; } var hw =, helloWorldGenerator (); hw.next ()//,{,价值:& # 39;你好# 39;,,:,false } hw.next ()//,{,价值:& # 39;& # 39;,,:,false } hw.next ()//,{,价值:& # 39;结束,,,:,true } hw.next ()//,{,值:未定义,,:,true }调用发电机函数,返回一个遍历器对象,代表生成器函数的内部指针。以后,每次调用遍历器对象的一方法,就会返回一个有着价值和完成两个属性的对象value属性表示当前的内部状态的值,是产量表达式后面那个表达式的值,完成属性是一个布尔值,表示是否遍历结束。
<强>产量表达式强>
产量表达式与返回语句既有相似之处,也有区别。相似之处在于,都能返回紧跟在语句后面的那个表达式的值。区别在于每次遇到产量、函数暂停执行,下一次再从该位置继续向后执行,而返回语句不具备位置记忆的功能。一个函数里面,只能执行一次(或者说一个)返回语句,但是可以执行多次(或者说多个)产量表达式。正常函数只能返回一个值,因为只能执行一次回报,发电机函数可以返回一系列的值,因为可以有任意多个收益。从另一个角度看,也可以说发电机生成了一系列的值,这也就是它的名称的来历(英语中,发电机这个词是“生成器”的意思)。
<>强语法注意点:强>
1。收益表达式只能用在发电机函数里面
2.收益表达式如果用在另一个表达式之中,必须放在圆括号里面
3。收益表达式用作函数参数或放在赋值表达式的右边,可以不加括号。
例如:
函数*,演示(),{ ,foo(油品收率& # 39;一个# 39;,,油品收率& # 39;b # 39;);//,好吧=,let input 产量;//,好吧 }<强>下一方法的参数强>
产量表达式本身没有返回值(就是说让=产量;会返回未定义),或者说总是返回undefined.next方法可以带一个参数,该参数就会被当作上一个收益表达式的返回值(注意,是表达式的返回值,例如让收益率..........=参数会是一个的值并且会覆盖表达式之前的值)。
函数*,f (), { ,(var 小姐:=,0,,真的,,我+ +),{ ,var reset =,油品收率我; ,console.log(重置); ,如果(重置){,小姐:=,1,,} ,} } var g =, f (); g.next ()