在 ES6 中新增了生成器函數的語法,本文解釋了生成器函數內 yield 關鍵字的返回值。
描述
根據語法規范,yield 關鍵字用來暫停和繼續執行一個生成器函數。當外部調用生成器的 next() 方法時,yield 關鍵字右側的表達式才會執行。
執行結果會轉化為一個對象(包含兩個屬性, value 和 done),作為 next() 方法的返回值。
對於 var foo = yield expression 語句,yield 左側變量 foo 的值將在下一次調用 next() 方法時獲得,並且等於調用時 next() 方法的參數。
舉例
首先構造一個生成器函數。
function* numbers() { console.log('function start.'); var v1 = yield 0; console.log('v1 = ' + v1); var v2 = yield 1; console.log('v2 = ' + v2); return 5; } var nums = numbers();
下面調用生成器函數。
// 第 1 次調用 next, v1 的值還沒有返回. console.log(nums.next(2));
程序輸出如下。
function start. { value: 0, done: false }
接着,執行第二次調用。
// 第 2 次調用 next, next 參數作為上一次 yield 值返回給 v1. console.log(nums.next(3));
此時程序輸出如下。
v1 = 3 { value: 1, done: false }
最后,執行第三次調用。
// 第 3 次調用 next, 此時 done 的值為 true, 直接返回 return 的值. console.log(nums.next(4));
程序結束執行,輸出如下。
v2 = 4 { value: 5, done: true }