jsvascript中的生成器函数
qingheluo2022-11-20清河洛410
function*声明方式(function关键字后跟一个星号)会定义一个生成器函数(generator function)生成器函数在执行时能暂停,后面又能从暂停处继续执行调用一个生成器函数并不会执行它里面的语句,而是返回一个这个生成器的迭代器(iterator)对象当这个迭代器的next()方法被调用时,其内的语句会执行到下一个yield位置为止,yield后紧跟迭代器要返回的值next()方法返回一个对象,这个对象包含两个属性:value 和 done,value属性表示本次yield语句后面的值,done 属性为布尔类型,表示生成器后续是否还有 yield 语句,即生成器函数是否...
function*声明方式(function关键字后跟一个星号)会定义一个生成器函数(generator function)
生成器函数在执行时能暂停,后面又能从暂停处继续执行
调用一个生成器函数并不会执行它里面的语句,而是返回一个这个生成器的迭代器(iterator)对象
当这个迭代器的next()方法被调用时,其内的语句会执行到下一个yield位置为止,yield后紧跟迭代器要返回的值
next()方法返回一个对象,这个对象包含两个属性:value 和 done,value属性表示本次yield语句后面的值,done 属性为布尔类型,表示生成器后续是否还有 yield 语句,即生成器函数是否已经执行完毕
如果next(val)方法传入了一个值,那么该值会赋值给上一次暂停位置的yield语句,所以第一次运行next()方法即使传入值也不会被接受,因为没有"上一次"暂停的yield语句
function* gen(){
yield 10;
x=yield 'foo';
console.log(x);
}
var gen_obj=gen();
console.log(gen_obj.next());
// 执行 yield 10,返回对象{value:10,done:false}
console.log(gen_obj.next(50));
// 将50赋值给上语句yield 10,但没有变量接受
// 遇到赋值语句先执行等号右侧部分,执行yield 'foo',返回对象{value:'foo',done:false}
// 遇到了yield,暂停,此时赋值语句还没有执行完毕
console.log(gen_obj.next(100));
// 将 100 赋给上一条yield 'foo',然后执行 x=100
// 继续向下执行console.log(x),打印100
// 整个执行完毕,返回对象{value:undefined,done:true}
}
当生成器函数中使用了return语句时,生成器会立即变为完成状态,next()方法返回对象的done为true,value为return的值,return后面没有值则为undefined
如果使用了yield*(多了个星号),则表示将执行权移交给另一个生成器函数,当前生成器暂停执行,直到另一个生成器函数运行完毕后继续执行后面的代码
function* gen2(i) {
yield i + 1;
yield i + 2;
}
function* gen1(i){
yield i;
yield* gen2(i);// 移交执行权
yield i;
}
var gen = gen1(10);
console.log(gen.next().value); // 10
console.log(gen.next().value); // 11
console.log(gen.next().value); // 12
console.log(gen.next().value); // 10