Generator生成器函数执行过程的理解

一个最基本的Generator函数格式如下,函数体内部要使用yield修饰符则必须在函数名前加上*号

let y = 0;

function *testYield(x){

console.log(‘before yield‘)

y = yield x + 1;

console.log(‘after yield‘)

return y;

}

结合此函数的调用代码如下,调用testYield(1) 并赋值给变量g时, 函数体内的任何语句并没有执行,只是生成了一个迭代器赋值给变量g

let g = testYield(1);

console.log(‘before next‘)

let y1 = g.next();

console.log(‘first next call:‘, y1)

console.log(‘y:‘, y)

console.log(‘second next call:‘,g.next(‘str param‘))// 等于y = yield,y被赋值为y1.value,如果这里next不传参,则y=undefined,而非x + 1

console.log(‘y:‘, y)

console.log(‘after next‘)

整个调用过程控制台打印如下

before next

before yield

first next call: {value: 2, done: false}--第一次next方法,next方法的返回值是一个对象,value属性是yield后面语句的返回值,done属性为布尔值,代表整个迭代过程是否已经结束

y: 0--可以看到,第一次执行next方法后,y的值仍然维持初始值不变,所以其实yield的作用是一个代码分界符,第一次调用next方法时函数执行到第一个yield后面的语句为止

after yield

second next call: {value: "str param", done: true}--第二次调用next方法后得到的value为字符串"str param",其实这个"str param"就是整个函数的return值,所以迭代器调用next方法的总次数为yield关键字的数量+1,

除最后一次调用next方法返回对象的value为函数的return值外,前面每次调用next方法返回对象的value值均为对应顺序的yield关键字后面语句的返回值,

但是要注意一点,第二次调用next方法的时候是传入参数"str param"的,如果不传,则最终y将为undefined,所以其实y = yield 可以理解为一个赋值语句,它赋的值第二次调用next方法时传入的参数,而非x + 1

y: str param --最终打印y的值也已经被修改为str param

after next

原文地址:https://www.cnblogs.com/kungfupan/p/11122233.html

时间: 2024-11-09 10:08:43

Generator生成器函数执行过程的理解的相关文章

ES6新特性三: Generator(生成器)函数详解

本文实例讲述了ES6新特性三: Generator(生成器)函数.分享给大家供大家参考,具体如下: 1. 简介 ① 理解:可以把它理解成一个函数的内部状态的遍历器,每调用一次,函数的内部状态发生一次改变. ② 写法: function* f() {} ③ 作用:就是可以完全控制函数的内部状态的变化,依次遍历这些状态. ④ 运行过程:当调用Generator函数的时候,该函数并不执行,而是返回一个遍历器(可以理解成暂停执行).通过调用next()开始执行,遇到yield停止执行,返回一个value

引入Promise对象和Generator生成器函数

当然,如果您只有一个 subscription 的话,就不需要执行这个命令. 下面我们使用Entity Framework Core试用Code First模式,结合领域驱动设计,快速构建领域模型,假设建模后的模型包含 “用户“”和“物品“两个实体,当然这种开发模式可以充分利用面向对象的设计理念,比如领域模型通过继承获取一些系统属性:BaseEntity 这个 ASP.NET Core 站点,既用了缓存,也有数据库访问操作,是一个典型的 Web 站点,如果它能持续稳定运行,将为我们全站迁移至 A

取代Promise的Generator生成器函数

接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还有一种常用的解决方案,它就是Generator生成器函数.顾名思义,它是一个生成器,它也是一个状态机,内部拥有值及相关的状态,生成器返回一个迭代器Iterator对象,我们可以通过这个迭代器,手动地遍历相关的值.状态,保证正确的执行顺序. 一.简单使用 1. 声明 Generator的声明方式类似一般的函数声明,只是多了个*号,并

函数可重入问题reentrant functions(函数执行过程中可以被中断,允许多个副本)

最近经常听到这个名词,以前也听到过,不过接触更多的是“线程安全问题”,而且本人也一直理解的是两个名字的含义是一样的.今天仔细总结一下这个名词相关的概念. 引用博文:可重入函数和不可重入函数 (http://www.cppblog.com/franksunny/archive/2007/08/03/29269.html) 主要用于多任务环境中, 一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误

加法运算符重载为从成员函数执行过程

今天学习了运算符重载函数,测试了复数类加减运算符的重载,不明白运算符重载函数的执行过程,重点探究一下: 首先贴出源代码 // example_1_2_cl_dt_fushujiajian.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namespace std; class complex { public: complex(double r=0.0,double i=0.0){re

webservice执行过程深入理解

前面我们搞了1,2个DEMO,基本对webservice服务发布,调用 ,执行 有一定的了解. 今天的话,我们再系统的梳理下webservice执行过程. 首先我们在webservice服务器端开发webservice接口,然后发布webservice: 然后我们通过一个Url调用webservice接口,比如发布的时候 ,url是 http://192.168.1.103/helloWorld 那我们请求的url就是 http://192.168.1.103/helloWorld?wsdl 我

关于函数执行过程的一点思考

刚刚有一个同学问我下面的代码出现了什么问题? 大家可以一起看看,这是初学者非常容易犯的错误. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <form action="" method=&q

ES6学习笔记&lt;三&gt; 生成器函数与yield

为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口(Interface),yield则是生成器函数中表示 返回 或 继续 执行的关键字. 弄清楚这两个概念后,先看一个例子: function* fun(val) { yield 1*val; yield 2*val; yield 3*val; yield 4*val; return 5*val; }

函数的执行过程——按值传递

上一篇博客我大概介绍了函数的由来和函数的执行过程,接下来,我要说明一下函数在执行的时候参数的传递方式--按值传递. 首先先用C++给大家写个函数,这个函数的功能是比较两个数的大小.然后函数参数在栈中的传递过程我会给大家贴张图. <span style="font-family:KaiTi_GB2312;font-size:18px;">#include<iostream> using namespace std; int max(int x ,int y) {