1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 10:22:23 +00:00

docs(generator): add generator context

This commit is contained in:
ruanyf 2017-11-24 14:44:51 +08:00
parent 1357a8e345
commit d808c68ce0

View File

@ -6,7 +6,7 @@
Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。本章详细介绍 Generator 函数的语法和 API它的异步编程应用请看《Generator 函数的异步应用》一章。
Generator 函数有多种理解角度。语法上首先可以把它理解成Generator 函数是一个状态机,封装了多个内部状态。
Generator 函数有多种理解角度。语法上首先可以把它理解成Generator 函数是一个状态机,封装了多个内部状态。
执行 Generator 函数会返回一个遍历器对象也就是说Generator 函数除了状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。
@ -1216,6 +1216,30 @@ Generator 函数是 ES6 对协程的实现但属于不完全实现。Generato
如果将 Generator 函数当作协程,完全可以将多个需要互相协作的任务写成 Generator 函数,它们之间使用`yield`表示式交换控制权。
### Generator 与上下文
JavaScript 代码运行时会产生一个全局的上下文环境context又称运行环境包含了当前所有的变量和对象。然后执行函数或块级代码的时候又会在当前上下文环境的上层产生一个函数运行的上下文变成当前active的上下文由此形成一个上下文环境的堆栈context stack
这个堆栈是“后进先出”的数据结构,最后产生的上下文环境首先执行完成,退出堆栈,然后再执行完成它下层的上下文,直至所有代码执行完成,堆栈清空。
Generator 函数不是这样,它执行产生的上下文环境,一旦遇到`yield`命令,就会暂时退出堆栈,但是并不消失,里面的所有变量和对象会冻结在当前状态。等到对它执行`next`命令时,这个上下文环境又会重新加入调用栈,冻结的变量和对象恢复执行。
```javascript
function *gen() {
yield 1;
return 2;
}
let g = gen();
console.log(
g.next().value,
g.next().value,
);
```
上面代码中,第一次执行`g.next()`Generator 函数`gen`的上下文会加入堆栈,即开始运行`gen`内部的代码。等遇到`yield 1`时,`gen`上下文退出堆栈,内部状态冻结。第二次执行`g.next()`时,`gen`上下文重新加入堆栈,变成当前的上下文,重新恢复执行。
## 应用
Generator 可以暂停函数执行,返回任意表达式的值。这种特点使得 Generator 有多种应用场景。