- 生成器的基本知识
生成器在执行时并不会和普通函数一样执行函数内部的内容,生成器函数执行之后会返回一个迭代对象,该迭代对象内部有next()、thorw()等方法,还有value等属性
- 在函数名前加* 就是生成器函数
function* information() {
console.log("hello!");
yield "bilibili:ejm";
console.log("hello world");
yield "like:Attack on Titan";
}
//迭代对象,在开发者工具中看到其属性和方法
let ejm = information();
console.log("ejm", ejm);
//next方法迭代
ejm.next();
ejm.next();
ejm.next();
console.log(ejm.next()); //输出第三次迭代的结果
-
yield关键字 空格后面要跟迭代的值,也可以跟另一个生成器函数
此时函数体内依然遵循栈的特点
function* AboutHobby() {
yield "bilibili:cartoon";
yield* Other(); //另一个生成器
yield "like:play game";
}
function* Other() {
yield "bilibili官网:https://www.bilibili.com/";
}
for (let msg of AboutHobby()) {
console.log(msg);
}
-
函数执行完成后,会处于非阻塞挂起的状态,直到下一次再用next()方法迭代
因此普通函数内几乎不可能会使用的 while(true) 语句可以在生成器函数中出现
-
局部变量id仅能由生成器访问,如果要再创建一个迭代对象,也不会影响到前一个迭代对象的迭代
function* IDGenerator() {
let id = 0;
while (true) {
yield ++id;
}
}
const idIterator = IDGenerator();
const idIterator2 = IDGenerator();
let obj1 = { id: idIterator.next().value, msg: "bilibili:cartoon" };
let obj2 = { id: idIterator.next().value, msg: "like:play game" };
let obj3 = {
id: idIterator.next().value,
msg: "bilibili官网:https://www.bilibili.com/",
};
console.log(obj1);
console.log(obj2);
console.log(obj3);
以上内容来自于b站视频学习