Generator函数

1、写法

function * smile() {}

function* smile() {}

function *smile() {}

星放哪里都可以,不过推荐第二个

function * smile() {

 const x = 1;

 yield x+ 1 // yield后面的表达是惰性计算的,得等到在执行的

 conslog.log('',(yield x+ 3)) yield表达式如果用在另一个表达式之中,必须放在圆括号里面

  const y = yield x + 7

 

}

let gener = smile() // 这个只是赋值

gener.next() 才是第一次执行

返回 这个{value: 2,done:false} 

yield 后面的值都返回外面去了,如果next()方法没带参数的话就是undefine 比如上面的y= undefine + 7 了

只有执行过一次next() 才能有带参数的说法,如果需要第一次执行的时候就有带参数的话,在包成函数,函数里面给她执行一次

2、generator函数返回的是遍历器对象,所有类似iterator接口

所有可以用 for...of循环以外,扩展运算符(...)、解构赋值和Array.from方法内部调用的,都是遍历器接口

用for..of done为ture就不会返回 ,return 返回的是{value:6: done: true}

 

 

 

 

 

 

 

3、多余多层yiled ,可以直接在yiled * generator函数,但是需要注意的是yiled * generator 这个语句是否不在正常的函数内,

如果yiled * generator里面的有return 的值会赋值为外面的属性中,并且外面的还会继续

 

 

 

4、generator函数中的this

 

 

 5、generator遍历器有return函数如果没有try{}finally{},直接终止,如果有try{}finally{}跳转finally里面执行(第一例子),并return最后一个输出(第二例子)

 let gener = funciton * () {

 let x = 1

 yield x+ 1

 yield x+ 2

 yield x+ 3

}

gener .next() ===== {value:2:done:false}

gener .return(6) ===== {value:6:done:false}

 gener .next() ===== {value:2:done:false}

 

6、generator遍历器tGenerator.prototype.throw,遍历器对象的throw,在f.throw(e),如果generator里面有catch会被内部捕获,如果内部没有,会被外部捕获,如果内外都没有,会报错停止,

 

 

 

 

 

posted @ 2020-09-13 16:12  无用之美  阅读(114)  评论(0)    收藏  举报