function show() {
console.log('a')
console.log('b')
}
show() // 普通函数
function *show2() {
console.log('1')
yield
console.log('2')
}
let genObj = show2() //返回的是指针对象
genObj.next() // 1
genObj.next() // 2
genObj.next()
需要调用next()方法启动执行,需要遇到 yield 停
generator函数前面加一个 *
两边可以有空格,或靠近函数或function
如果函数前漏掉 *
- 就是普通函数
- 如果有
yield
会报错,ReferenceError: yield is not defined
- yield 只能在Generator函数内部使用
yield
- 既可传参,又可以返回
- 第一个
next()
传参无效,只用来启动
给yield穿参数
function * show() {
console.log('1')
var a = yield
console.log('2')
console.log(a)
}
var gen = show()
gen.next() // 1
gen.next() // 2 和 undefined
var gen = show()
gen.next(10) // 1
gen.next(20) // 2 和 20
如果要给第一个yield前的语句传参,可以把参数加在函数里,但是这个参数是整个生成器共享,即第二个yield也可以拿到
function * show(p) {
console.log('1')
console.log(p)
var a = yield
console.log('2')
console.log(a)
console.log(p)
}
var gen = show(10)
gen.next() // 1 和 10
gen.next(20) // 2 和 20 10
利用yield返回值
// yield 返回
function * show() {
console.log('1')
yield 10
console.log('2')
}
var gen = show()
var res1 = gen.next()
console.log(res1) // { value: 10, done: false }
var res2 = gen.next()
console.log(res2) // { value: undefined, done: true }
如果要给最后一个yield执行后返回值,可以利用return
function * show() {
console.log('1')
yield 10
console.log('2')
return 20
}
// yield 返回
var gen = show()
var res1 = gen.next()
console.log(res1) // { value: 10, done: false }
var res2 = gen.next()
console.log(res2) // { value: 20, done: true }