Skip to content

Commit d808c68

Browse files
committed
docs(generator): add generator context
1 parent 1357a8e commit d808c68

File tree

1 file changed

+25
-1
lines changed

1 file changed

+25
-1
lines changed

docs/generator.md

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。本章详细介绍 Generator 函数的语法和 API,它的异步编程应用请看《Generator 函数的异步应用》一章。
88

9-
Generator 函数有多种理解角度。从语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。
9+
Generator 函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。
1010

1111
执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。
1212

@@ -1216,6 +1216,30 @@ Generator 函数是 ES6 对协程的实现,但属于不完全实现。Generato
12161216

12171217
如果将 Generator 函数当作协程,完全可以将多个需要互相协作的任务写成 Generator 函数,它们之间使用`yield`表示式交换控制权。
12181218

1219+
### Generator 与上下文
1220+
1221+
JavaScript 代码运行时,会产生一个全局的上下文环境(context,又称运行环境),包含了当前所有的变量和对象。然后,执行函数(或块级代码)的时候,又会在当前上下文环境的上层,产生一个函数运行的上下文,变成当前(active)的上下文,由此形成一个上下文环境的堆栈(context stack)。
1222+
1223+
这个堆栈是“后进先出”的数据结构,最后产生的上下文环境首先执行完成,退出堆栈,然后再执行完成它下层的上下文,直至所有代码执行完成,堆栈清空。
1224+
1225+
Generator 函数不是这样,它执行产生的上下文环境,一旦遇到`yield`命令,就会暂时退出堆栈,但是并不消失,里面的所有变量和对象会冻结在当前状态。等到对它执行`next`命令时,这个上下文环境又会重新加入调用栈,冻结的变量和对象恢复执行。
1226+
1227+
```javascript
1228+
function *gen() {
1229+
yield 1;
1230+
return 2;
1231+
}
1232+
1233+
let g = gen();
1234+
1235+
console.log(
1236+
g.next().value,
1237+
g.next().value,
1238+
);
1239+
```
1240+
1241+
上面代码中,第一次执行`g.next()`时,Generator 函数`gen`的上下文会加入堆栈,即开始运行`gen`内部的代码。等遇到`yield 1`时,`gen`上下文退出堆栈,内部状态冻结。第二次执行`g.next()`时,`gen`上下文重新加入堆栈,变成当前的上下文,重新恢复执行。
1242+
12191243
## 应用
12201244

12211245
Generator 可以暂停函数执行,返回任意表达式的值。这种特点使得 Generator 有多种应用场景。

0 commit comments

Comments
 (0)