生成器函數(shù)
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!";
}
- 生成器函數(shù)以
function*
標(biāo)注 -
yield
關(guān)鍵字,會(huì)暫停生成器的執(zhí)行,在之后可以繼續(xù)執(zhí)行
生成器的使用
> 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 }
當(dāng)執(zhí)行生成器函數(shù)時(shí),函數(shù)不會(huì)立即執(zhí)行坯苹,調(diào)用next
方法會(huì)執(zhí)行到下一個(gè)yield
語句,并返回yield的值
當(dāng)所有yield執(zhí)行完成后摇天,返回 { value: undefined, done: true }
生成器函數(shù)是迭代器
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);
}
- 生成器對(duì)象的
next
函數(shù)可以傳值粹湃,傳入的值作為yield
的返回值 -
return
方法結(jié)束生成器方法的執(zhí)行,但如果生成器方法里有finally泉坐,則會(huì)執(zhí)行finally -
throw
方法會(huì)在yield方法出拋出異常 - 如果生成器對(duì)象的
return
方法沒被調(diào)用为鳄,卻被回收了,則finally不會(huì)被執(zhí)行
yield*
可以返回iterator的所有值
function* concat(iter1, iter2) {
for (var value of iter1) {
yield value;
}
for (var value of iter2) {
yield value;
}
}
以上可以簡(jiǎn)寫為:
function* concat(iter1, iter2) {
yield* iter1;
yield* iter2;
}