試一試
function* foo(index) {
while (index < 2) {
yield index;
index++;
}
}
const iterator = foo(0);
console.log(iterator.next().value);
// Expected output: 0
console.log(iterator.next().value);
// Expected output: 1
語法
yield
yield expression
引數
expression可選-
透過迭代器協議從生成器函式中產出的值。如果省略,則產出
undefined。
返回值
返回傳遞給生成器的 next() 方法以恢復其執行的可選值。
注意:這意味著 next() 是不對稱的:它總是向當前暫停的 yield 傳送一個值,但返回下一個 yield 的運算元。傳遞給第一次 next() 呼叫的引數無法檢索,因為沒有當前暫停的 yield。
描述
yield 關鍵字暫停生成器函式的執行,並且 yield 關鍵字後的表示式的值將返回給生成器的呼叫者。可以將其視為基於生成器版本的 return 關鍵字。
yield 只能直接在其包含的生成器函式中使用。它不能在巢狀函式中使用。
呼叫生成器函式會構造一個Generator 物件。每次呼叫生成器的next() 方法時,生成器都會恢復執行,並執行直到達到以下條件之一:
- 一個
yield表示式。在這種情況下,生成器暫停,並且next()方法返回一個具有兩個屬性的迭代器結果物件:value和done。value屬性是yield運算子之後表示式的值,done為false,表示生成器函式尚未完全完成。 - 生成器函式的末尾。在這種情況下,生成器的執行結束,並且
next()方法返回一個迭代器結果物件,其中value為undefined,done為true。 - 一個
return語句。在這種情況下,生成器的執行結束,並且next()方法返回一個迭代器結果物件,其中value為指定的返回值,done為true。 - 一個
throw語句。在這種情況下,生成器的執行完全停止,並且next()方法丟擲指定的異常。
一旦在 yield 表示式處暫停,生成器的程式碼執行將保持暫停狀態,直到再次呼叫生成器的 next() 方法。如果將可選值傳遞給生成器的 next() 方法,則該值將成為生成器當前 yield 操作返回的值。第一次 next() 呼叫沒有相應的暫停 yield 操作,因此無法獲取傳遞給第一次 next() 呼叫的引數。
如果呼叫了生成器的return() 或throw() 方法,其作用類似於在暫停的 yield 表示式處執行了 return 或 throw 語句。您可以在生成器函式體中使用 try...catch...finally 來處理這些提前完成。如果呼叫 return() 或 throw() 方法但沒有暫停的 yield 表示式(因為 next() 尚未被呼叫,或者因為生成器已經完成),那麼這些提前完成將無法處理,並且總是終止生成器。
示例
使用 yield
以下程式碼是一個示例生成器函式的宣告。
function* countAppleSales() {
const saleList = [3, 7, 5];
for (const sale of saleList) {
yield sale;
}
}
一旦定義了生成器函式,就可以透過構造迭代器來使用它,如所示。
const appleStore = countAppleSales(); // Generator { }
console.log(appleStore.next()); // { 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 }
您還可以使用 next(value) 將一個值傳送到生成器中。step 將作為 yield 表示式的返回值進行評估——儘管第一次呼叫 next() 時傳遞給生成器 next() 方法的值會被忽略。
function* counter(value) {
while (true) {
const step = yield value++;
if (step) {
value += step;
}
}
}
const generatorFunc = counter(0);
console.log(generatorFunc.next().value); // 0
console.log(generatorFunc.next().value); // 1
console.log(generatorFunc.next().value); // 2
console.log(generatorFunc.next().value); // 3
console.log(generatorFunc.next(10).value); // 14
console.log(generatorFunc.next().value); // 15
console.log(generatorFunc.next(10).value); // 26
規範
| 規範 |
|---|
| ECMAScript® 2026 語言規範 # prod-YieldExpression |
瀏覽器相容性
載入中…