yield

Baseline 已廣泛支援

此特性已非常成熟,可在多種裝置和瀏覽器版本上使用。自 ⁨2016 年 9 月⁩以來,它已在各大瀏覽器中可用。

yield 運算子用於暫停和恢復生成器函式的執行。

試一試

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

語法

js
yield
yield expression

引數

expression 可選

透過迭代器協議從生成器函式中產出的值。如果省略,則產出 undefined

返回值

返回傳遞給生成器的 next() 方法以恢復其執行的可選值。

注意:這意味著 next() 是不對稱的:它總是向當前暫停的 yield 傳送一個值,但返回下一個 yield 的運算元。傳遞給第一次 next() 呼叫的引數無法檢索,因為沒有當前暫停的 yield

描述

yield 關鍵字暫停生成器函式的執行,並且 yield 關鍵字後的表示式的值將返回給生成器的呼叫者。可以將其視為基於生成器版本的 return 關鍵字。

yield 只能直接在其包含的生成器函式中使用。它不能在巢狀函式中使用。

呼叫生成器函式會構造一個Generator 物件。每次呼叫生成器的next() 方法時,生成器都會恢復執行,並執行直到達到以下條件之一:

  • 一個 yield 表示式。在這種情況下,生成器暫停,並且 next() 方法返回一個具有兩個屬性的迭代器結果物件:valuedonevalue 屬性是 yield 運算子之後表示式的值,donefalse,表示生成器函式尚未完全完成。
  • 生成器函式的末尾。在這種情況下,生成器的執行結束,並且 next() 方法返回一個迭代器結果物件,其中 valueundefineddonetrue
  • 一個 return 語句。在這種情況下,生成器的執行結束,並且 next() 方法返回一個迭代器結果物件,其中 value 為指定的返回值,donetrue
  • 一個 throw 語句。在這種情況下,生成器的執行完全停止,並且 next() 方法丟擲指定的異常。

一旦在 yield 表示式處暫停,生成器的程式碼執行將保持暫停狀態,直到再次呼叫生成器的 next() 方法。如果將可選值傳遞給生成器的 next() 方法,則該值將成為生成器當前 yield 操作返回的值。第一次 next() 呼叫沒有相應的暫停 yield 操作,因此無法獲取傳遞給第一次 next() 呼叫的引數。

如果呼叫了生成器的return()throw() 方法,其作用類似於在暫停的 yield 表示式處執行了 returnthrow 語句。您可以在生成器函式體中使用 try...catch...finally 來處理這些提前完成。如果呼叫 return()throw() 方法但沒有暫停的 yield 表示式(因為 next() 尚未被呼叫,或者因為生成器已經完成),那麼這些提前完成將無法處理,並且總是終止生成器。

示例

使用 yield

以下程式碼是一個示例生成器函式的宣告。

js
function* countAppleSales() {
  const saleList = [3, 7, 5];
  for (const sale of saleList) {
    yield sale;
  }
}

一旦定義了生成器函式,就可以透過構造迭代器來使用它,如所示。

js
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() 方法的值會被忽略。

js
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

瀏覽器相容性

另見