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 66
77Generator 函数是 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
12211245Generator 可以暂停函数执行,返回任意表达式的值。这种特点使得 Generator 有多种应用场景。
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments