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会被内部捕获,如果内部没有,会被外部捕获,如果内外都没有,会报错停止,




浙公网安备 33010602011771号