生成器函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同
语法: function * fun(){ }
javascript
function * gen(){
console.log("hello generator");
}
let iterator =gen()
console.log(iterator)
打印:
我们发现没有打印"hello generator"
我们需要使用到next方法
如果大家对迭代器感兴趣大家可以阅读这篇ES6初步了解迭代器
javascript
function * gen(){
console.log("hello generator");
}
let iterator =gen()
iterator.next()
我们可以使用yield,可以看作是函数代码的分隔符
javascript
function * gen(){
console.log(111)
yield "hello"
console.log(222)
yield "generator"
console.log(333)
yield "!"
console.log(444)
}
let iterator =gen()
iterator.next() //111
iterator.next() //222
iterator.next() //333
iterator.next() //444
我们也可以使用for...of来遍历
javascript
function* gen() {
yield "hello"
yield "generator"
yield "!"
}
for (let v of gen()) {
console.log(v)
}
生成器函数的参数传递
javascript
function* gen(arg) {
console.log(arg)
yield 111
yield 222
yield 333
}
// 执行获取迭代器对象
let iterator = gen("aaa")
console.log(iterator.next())
next方法可以传入实参
javascript
function* gen(arg) {
console.log(arg) //AAA
let one = yield 111
console.log(one) //BBB
let two = yield 222
console.log(two) //CCC
let three = yield 333
console.log(three) //DDD
}
// 执行获取迭代器对象
let iterator = gen("AAA")
console.log(iterator.next())
// 第二次调next方法传入这个实参作为第一个yield语句的返回结果
console.log(iterator.next("BBB"))
// 第三次调next方法传入这个实参作为第二个yield语句的返回结果
console.log(iterator.next("CCC"))
// 第四次调next方法传入这个实参作为第三个yield语句的返回结果
console.log(iterator.next("DDD"))
// 以此类推
感谢大家的阅读,如有不对的地方,可以向我指出,感谢大家!