生成器(Generators)简介
生成器函数
- 普通函数使用 function 声明,而生成器函数使用 function* 声明
- 在生成器函数内部,有一种类似 return 的语法:关键字 yield。二者的区别是,普通函数只可以 return 一次,而生成器函数可以 yield 多次(当然也可以只 yield 一次)。在生成器的执行过程中,遇到 yield 表达式立即暂停,后续可恢复执行状态。
普通函数和生成器函数之间最大的区别,普通函数不能自暂停,生成器函数可以。
function* quips(name) {
yield " 你好 " + name + "!";
yield " 希望你能喜欢这篇介绍 ES6 的译文 ";
if (name.startsWith("X")) {
yield " 你的名字 " + name + " 首字母是 X,这很酷!";
}
yield " 我们下次再见!";
}
调用一个生成器函数并不会马上执行它里面的语句,而是返回一个这个生成器的 迭代器 ( iterator )
对象。
> var iter = quips("jorendorff");
[object Generator]
> iter.next()
{ value: " 你好 jorendorff!", done: false }
> iter.next()
{ value: " 希望你能喜欢这篇介绍 ES6 的译文 ", done: false }
> iter.next()
{ value: " 我们下次再见!", done: false }
> iter.next()
{ value: undefined, done: true }
next()
next() 方法返回一个包含属性 done 和 value 的对象。
该方法也可以通过接受一个参数用以向生成器传值。
function* gen() {
while(true) {
var value = yield null;
console.log(value);
}
}
var g = gen();
g.next(1);
// "{ value: null, done: false }"
g.next(2);
// 2
// "{ value: null, done: false }"
yield*
返回一个Generator
function* g1() {
yield 2;
yield 3;
yield 4;
}
function* g2() {
yield 1;
yield* g1();
yield 5;
}
var iterator = g2();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: 4, done: false }
console.log(iterator.next()); // { value: 5, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
throw()
throw() 方法用来向生成器抛出异常,并恢复生成器的执行,返回带有 done 及 value 两个属性的对象。
var g = function* () {
try {
yield 1;
console.log('输出',1);
yield 2;
console.log('输出',2);
yield 3;
} catch (e) {
console.log('内部捕获', e);
}
};
var i = g();
try {
i.next(); // { value: 1, done: false }
i.next(); // { value: 2, done: false }
i.throw('a');
i.next(); // { value: undefined, done: true }
i.throw('b');
i.throw('c');
} catch (e) {
console.log('外部捕获', e);
}
return()
return() 方法返回给定的值并结束生成器。
unction* gen() {
yield 1;
yield 2;
yield 3;
}
var g = gen();
g.next(); // { value: 1, done: false }
g.return("foo"); // { value: "foo", done: true }
g.next(); // { value: undefined, done: true }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!