博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js-ES6学习笔记-Generator函数
阅读量:5899 次
发布时间:2019-06-19

本文共 1542 字,大约阅读时间需要 5 分钟。

1、Generator 函数是 ES6 提供的一种异步编程解决方案。形式上,Generator 函数是一个普通函数,但是有两个特征。一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield语句,定义不同的内部状态。

2、Generator函数的调用方法与普通函数一样,也是在函数名后面加上一对圆括号。不同的是,调用Generator函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象,也就是上一章介绍的遍历器对象(Iterator Object)。

3、必须调用遍历器对象的next方法,使得指针移向下一个状态。也就是说,每次调用next方法,内部指针就从函数头部或上一次停下来的地方开始执行,直到遇到下一个yield语句(或return语句)为止。换言之,Generator函数是分段执行的,yield语句是暂停执行的标记,而next方法可以恢复执行。

4、总结一下,调用Generator函数,返回一个遍历器对象,代表Generator函数的内部指针。以后,每次调用遍历器对象的next方法,就会返回一个有着valuedone两个属性的对象。value属性表示当前的内部状态的值,是yield语句后面那个表达式的值;done属性是一个布尔值,表示是否遍历结束。

5、一个函数里面,只能执行一次(或者说一个)return语句,但是可以执行多次(或者说多个)yield语句。正常函数只能返回一个值,因为只能执行一次return;Generator函数可以返回一系列的值,因为可以有任意多个yield

6、由于Generator函数就是遍历器生成函数,因此可以把Generator赋值给对象的Symbol.iterator属性,从而使得该对象具有Iterator接口。

var myIterable = {};myIterable[Symbol.iterator] = function* () {  yield 1;  yield 2;  yield 3;};[...myIterable] // [1, 2, 3]

7、yield句本身没有返回值,或者说总是返回undefinednext方法可以带一个参数,该参数就会被当作上一个yield语句的返回值。

8、下面是一个利用Generator函数和for...of循环,实现斐波那契数列的例子。

function* fibonacci() {  let [prev, curr] = [0, 1];  for (;;) {    [prev, curr] = [curr, prev + curr];    yield curr;  }}for (let n of fibonacci()) {  if (n > 1000) break;  console.log(n);}

9、除了for...of循环以外,扩展运算符(...)、解构赋值和Array.from方法内部调用的,都是遍历器接口。这意味着,它们都可以将Generator函数返回的Iterator对象,作为参数。

function* numbers () {  yield 1  yield 2  return 3  yield 4}// 扩展运算符[...numbers()] // [1, 2]// Array.from 方法Array.from(numbers()) // [1, 2]// 解构赋值let [x, y] = numbers();x // 1y // 2// for...of 循环for (let n of numbers()) {  console.log(n)}// 1// 2

 

转载地址:http://puesx.baihongyu.com/

你可能感兴趣的文章
《精进:如何成为一个很厉害的人》读书笔记(转载)
查看>>
linux下修改/etc/profile文件
查看>>
cropper实现图片剪切上传
查看>>
谈谈java的BlockingQueue
查看>>
java 读excel xlsx
查看>>
20165313 我期望的师生关系
查看>>
CentOS7+CDH5.14.0安装CDH错误排查: HiveServer2 该角色的进程已退出。该角色的预期状态为已启动...
查看>>
GCC
查看>>
The Oregon Trail 俄勒冈之旅
查看>>
Excel VBA连接MySql 数据库获取数据
查看>>
php 的命名空间 看鸟哥后的随笔
查看>>
svn提交问题
查看>>
centos上的grub文件修改
查看>>
java 字节流输入输出
查看>>
小行星群 网络流 二分图
查看>>
微信小程序 组件 Demo
查看>>
Elasticsearch,Filebeat,Kibana部署,添加图表及elastalert报警
查看>>
django项目的生产环境部署,利用nginx+uwsgi
查看>>
setUserVisibleHint的使用.执行顺序和viewPager.setOffscreenPageLimit(0)不管用还是默认会加载第二个fragment...
查看>>
慢性疲劳免疫失调综合症(CFIDS)
查看>>