生成器函数
function* quips(name) {
yield "hello " + name + "!";
yield "i hope you are enjoying the blog posts";
if (name.startsWith("X")) {
yield "it's cool how your name starts with X, " + name;
}
yield "see you later!";
}
- 生成器函数以
function*
标注 -
yield
关键字,会暂停生成器的执行,在之后可以继续执行
生成器的使用
> var iter = quips("jorendorff");
[object Generator]
> iter.next()
{ value: "hello jorendorff!", done: false }
> iter.next()
{ value: "i hope you are enjoying the blog posts", done: false }
> iter.next()
{ value: "see you later!", done: false }
> iter.next()
{ value: undefined, done: true }
当执行生成器函数时,函数不会立即执行,调用next
方法会执行到下一个yield
语句,并返回yield的值
当所有yield执行完成后,返回 { value: undefined, done: true }
生成器函数是迭代器
function* range(start, stop) {
for (var i = start; i < stop; i++)
yield i;
}
for (var value of range(0, 3)) {
alert("Ding! at floor #" + value);
}
- 生成器对象的
next
函数可以传值,传入的值作为yield
的返回值 -
return
方法结束生成器方法的执行,但如果生成器方法里有finally,则会执行finally -
throw
方法会在yield方法出抛出异常 - 如果生成器对象的
return
方法没被调用,却被回收了,则finally不会被执行
yield*
可以返回iterator的所有值
function* concat(iter1, iter2) {
for (var value of iter1) {
yield value;
}
for (var value of iter2) {
yield value;
}
}
以上可以简写为:
function* concat(iter1, iter2) {
yield* iter1;
yield* iter2;
}