yield 關鍵字用來暫停和恢復一個生成器函數((function* 或遺留的生成器函數)。web
[rv] = yield [expression];
複製代碼
expression 定義經過迭代器協議從生成器函數返回的值。若是省略,則返回undefined。express
rv 返回傳遞給生成器的next()方法的可選值,以恢復其執行。瀏覽器
yield關鍵字使生成器函數執行暫停,yield關鍵字後面的表達式的值返回給生成器的調用者。它能夠被認爲是一個基於生成器的版本的return關鍵字。bash
yield關鍵字實際返回一個IteratorResult對象,它有兩個屬性,value和done。value屬性是對yield表達式求值的結果,而done是false,表示生成器函數還沒有徹底完成。app
一旦遇到 yield 表達式,生成器的代碼將被暫停運行,直到生成器的 next() 方法被調用。每次調用生成器的next()方法時,生成器都會恢復執行,直到達到如下某個值:函數
若是將參數傳遞給生成器的next()方法,則該值將成爲生成器當前yield操做返回的值。ui
在生成器的代碼路徑中的yield運算符,以及經過將其傳遞給Generator.prototype.next()指定新的起始值的能力之間,生成器提供了強大的控制力。spa
next()能夠帶一個參數,該參數會被認爲是上一個yield總體的返回值,稍後將在代碼中展現。prototype
能夠在不一樣階段從外部直接向內部注入不一樣的值來調整函數的行爲(這一點是其餘循環很難作到的,或要付出較大的代價才能夠作到)code
function* countAppleSales () {
var saleList = [3, 7, 5];
for (var i = 0; i < saleList.length; i++) {
yield saleList[i];
}
}
var appleStore = countAppleSales();
console.log(appleStore); // Generator { }
console.log(appleStore.next(countAppleSales())); // { value: 3, done: false }
console.log(appleStore.next()); // { value: 7, done: false }
console.log(appleStore.next()); // { value: 5, done: false }
console.log(appleStore.next()); // { value: undefined, done: true }
複製代碼
function* countAppleSales(){
for(var i=0; true; i++){
var reset = yield i;
if(reset){
i = -1;
}
}
}
var appleStore = countAppleSales();
console.log(appleStore.next()); //{ value: 0, done: false }
console.log(appleStore.next()); //{ value: 1, done: false }
console.log(appleStore.next()); //{ value: 2, done: false }
console.log(appleStore.next(true)); //{ value: 0, done: false }
console.log(appleStore.next()); //{ value: 1, done: false }
console.log(appleStore.next()); //{ value: 2, done: false }
複製代碼
function* test(x){
var y = 2 * (yield (x + 1));
var z = yield(y/3);
console.log("x=" + x + ",y=" + y + ",z=" + z);
return (x + y + z);
}
var a = test(5);
a.next(); //{ value: 6, done: false }
a.next(); //{ value: NaN, done: false }
a.next(); //x=5,y=NaN,z=undefined web-517059656c042747f821.js:1:478047
//{ value: NaN, done: true }
a.next();{ value: undefined, done: true }
var b = test(5);
b.next(); //{ value: 6, done: false }
b.next(12); //{ value: 8, done: false }
b.next(13); //x=5,y=24,z=13 web-517059656c042747f821.js:1:478047
//{ value: 42, done: true }
b.next(); //{ value: undefined, done: true }
複製代碼
A組
B組