generator
-
定义:用来生成使用 yield 表达式创建的生成器
yield
返回数据格式- { value: 得到的结果 , done: 布尔值(告知generator函数是否执行完毕) }
-
实例:
/** *必须在函数前面添加“*”已告知是generator函数 *value即yield表达式所生成的数据 */ function* gen(x){ yield x + 2; }; let g = gen(1); //返回 yield 表达式产生的值. g.next(); // { value: 3 , done:false} //在来执行一遍g.next()返回的结果是? g.next(); // { value: undefind , done:true} //表示,已经将x+2执行成功,并且下面没有要执行的函数 //如我们使用g.next(100)返回的结果是? g.next(); // { value: 100 , done:true} /**为什么会输出这样的结果呢? *而不是{ value: 102 , done:false} *因为gen(1)方法已经执行完毕了,但是我们调用next(100), 方法是告诉generator函数,下一个yield *表达式产生的值,是什么 */
-
下面实例用以理解generator函数
function* foo(x) { yield x + 1; yield x - 2; }; let f = foo(2); f.next(); // { value: 3 , done:false} f.next(); // { value: 0 , done:false} f.next(); // { value: undefind , done:true} /** *如上例子告诉我们,当调用next()方法的时候成只会一个yield *且调用当一个yield已完成,下次再调用next()方法也不会执行,只会执行未执行yield */ //一个无限迭代器 function* idMaker(){ let index = 0; while(true) yield index++; } let gen = idMaker(); console.log(gen.next()); // { value: 1 , done:false} console.log(gen.next()); // { value: 2 , done:false} console.log(gen.next()); // { value: 3 , done:false} // ... //有的同学就会问到,为什么yield执行完毕还会执行? //因为:每次在while循环中都会生成一个新的yield
-
详细请产考https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/function*