-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Generator函数 #14
Comments
yaofly2012
changed the title
ES7:async/await, generator, iterator
async/await, generator, iterator
Nov 2, 2018
深入Generator——异步都说 一、使用
|
yaofly2012
changed the title
async/await, generator, iterator
JS-异步-generator, async/await
Feb 17, 2020
yaofly2012
changed the title
JS-异步-generator, async/await
JS-ES6-ESnext-generator, async/await
Feb 21, 2020
深入Generator——polyfill |
yaofly2012
changed the title
JS-ES6-ESnext-generator, async/await
JS-ES6-ESnext-generator函数
Feb 22, 2020
练习1. 输出结果var a = 0
function* gen(x) {
a = a + (yield x);
console.log(3, a)
}
var g = gen(10)
var r = g.next();
console.log(1, r.value)
a++;
console.log(2, a)
g.next(5); 知识点:
|
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
一、Generator function(生成器函数)
1.1 语法
格式上跟普通函数就多个了星号
*
;星号
*
和function
,函数名之间可以没有空格,一般把星号和function
放一起。生成器函数返回值是个生成器对象
构造函数有自己的返回值逻辑,并且构造函数是解决继承写法问题。虽然不能作为构造函数,但生成器函数也是有
prototype
属性的。没有
function
关键字。1.2 特性
再次执行时上下文跟上次暂停时一样。
next/throw/return
)执行时才执行相关代码,遇到下一个yield
表达式时暂停(或者return
/throw
语句结束);yield
关键字把生成器函数分割成一段段可执行代码片段,调用next
方法时就执行其中的代码片段return
和throw
方法会立即终止,不会再次执行。return
语句表示生成器函数最终的值next
方法直接向外抛:yield*
写法表示遍历其他生成器对象yield*
相当于:本质上
yield*
后面可以是任意可迭代对象二、生成器对象(Generator)
生成器对象是一个内部含有状态的对象,通过并且只能通过生成器函数创建。
2.1 语法
生成器函数的返回值。
Object.prototype.toString
判断生成器函数和生成器对象类型GeneratorFunction
,Generator
;yield
表达式和return
语句用于定义生成器对象的内部状态;2.2 遍历
生成器对象本身就是个可迭代对象,但是只能一次性遍历。
2.3 APIs
1. next(value)
next
方法用于获取生成器对象下一个状态,即yield
后面表达式的值 ;value
可以指定生成器函数里yield
表达式的值 (注意区分“yield后面表达式的值”和yield
表达式本身的值)next
方法的实参作为yield
表达式的值;外部可以用作向生成器对象传递值,并告诉生成器对象继续执行。
next
方法的返回值就是yield
后面的表达式的值。外部可以用作获取生成器对象内部的值
这种机制很重要,是实现异步同步化的关键。
2. return(value)
让生成器函数在上次暂停的地方(或者函数开始处)立马结束,并返回指定的状态值(return方法实参):
return
方法可以多次调用,返回值的value属性是调用时的实参;这个跟
next
方法的返回值逻辑不一样。return
方法时,生成器函数从上一次暂定的地方或者函数开始处就结束(即后面的代码不会再执行);try-finally
语句块中finally
语句块中语句必须要执行,这跟return
方法立马结束有点冲突。当调用
return
方法时,如果上个yield
表达式在try
语句块中则return
方法会推迟到finally
代码块执行完再执行,并且可以修改返回值。即保证了finally
的语法规则不变(一定要执行,可以修改try/catch中的返回值)。3. throw(exception)
让生成器函数在上次暂停的地方(或者函数开始处)抛出指定异常(throw方法实参)。
throw
返回值的取值逻辑同next
方法;可以把
throw
方法视为抛出异常的next
方法。throw
方法相当于让生成器函数在上次暂停的地方(或者函数开始处)处抛一个异常,如果生成器函数没有捕获,则会向外抛,则相当于调用throw
处抛一个异常,也说明了函数开始处抛出的异常无法内部捕获。如果要捕获生成器没有捕获的异常,得在调用
throw
处捕获:4. 总结
next/return/throw
方法都是用于恢复生成器函数执行,区别是:next
:继续执行;return
:终止执行,并返回指定的值;throw
:终止执行,并抛出指定的异常。这三个方法是外部控制生成器对象的执行,可用于实现异步逻辑同步化关键。
用“语句替换”描述只是便于理解吧,但是有点误导。起码
return
和throw
方法可以在函数开始处立马结束(生成器函数都没有执行)三、生成器原理
先看看下面输出是什么:
稍微调整代码,下面输出是什么:
再稍微调整代码,下面输出是什么:
执行下文会被暂存
遇到
yield
表达式时,生成器函数暂停执行,退出调用栈,但是执行下文会被暂存。恢复执行
暂存的执行上下文也被恢复。
回到上面的问题Demo1和Demo2的结果为啥不一样?
在
Demo1
中语句a = a + (yield x);
算术运算从左向右执行的,等执行到yield x
时变量a
已经参与运算了,暂停执行的时候,会存在临时变量里了。相当于:参考
The text was updated successfully, but these errors were encountered: