File tree Expand file tree Collapse file tree 1 file changed +25
-1
lines changed Expand file tree Collapse file tree 1 file changed +25
-1
lines changed Original file line number Diff line number Diff line change 6
6
7
7
Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。本章详细介绍 Generator 函数的语法和 API,它的异步编程应用请看《Generator 函数的异步应用》一章。
8
8
9
- Generator 函数有多种理解角度。从语法上 ,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。
9
+ Generator 函数有多种理解角度。语法上 ,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。
10
10
11
11
执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。
12
12
@@ -1216,6 +1216,30 @@ Generator 函数是 ES6 对协程的实现,但属于不完全实现。Generato
1216
1216
1217
1217
如果将 Generator 函数当作协程,完全可以将多个需要互相协作的任务写成 Generator 函数,它们之间使用` yield ` 表示式交换控制权。
1218
1218
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
+
1219
1243
## 应用
1220
1244
1221
1245
Generator 可以暂停函数执行,返回任意表达式的值。这种特点使得 Generator 有多种应用场景。
You can’t perform that action at this time.
0 commit comments