生成器函數
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;
}