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*