#JavaScript生成器教程
生成器是一種特殊類型的函數,具備自我暫停和稍後恢復的能力,從而允許其他代碼在此期間運行。
生成器是一種特殊類型的函數,具備自我暫停和稍後恢復的能力,從而允許其他代碼在此期間運行。
代碼決定自己需要等待,所以它讓“隊列中的其他代碼”運行,並保留當“它等待的東西”完成時恢復操作的權利。
所有這些都是通過一個簡單的關鍵字yield
完成的。當生成器包含該關鍵字時,執行被暫停。
生成器可以包含多個yield
關鍵字,因此可以多次暫停,並且通過*function
關鍵字進行標識,不要將其與用於低層次編程語言(如C,C ++或Go)的指針解引用運算符混淆。
生成器使得在JavaScript中實現全新的編程範式成為可能,包括:
- 在生成器運行時的雙向通信
- 長壽命的循環不會凍結您的程序
以下是解釋它們如何工作的生成器的示例。
function \*calculator(input) {
var doubleThat = 2 \* (yield (input / 2))
var another = yield (doubleThat)
return (input \* doubleThat \* another)
}
使用以下方式初始化它:
const calc = calculator(10)
然後在生成器上啟動迭代器:
calc.next()
第一次迭代開始運行迭代器。代碼返回以下對象:
{
done: false
value: 5
}
發生的情況是:代碼運行函數,並將input = 10
作為傳遞給生成器構造函數的參數。它運行直到達到yield
語句,並返回yield
的內容:input / 2 = 5
。因此,我們獲得了一個值為5的結果,並且告知迭代尚未完成(函數僅暫停)。
在第二次迭代中,我們將值7
傳遞進去:
calc.next(7)
返回的結果是:
{
done: false
value: 14
}
7
被設置為doubleThat
的值。重要的是:你可能會認為input / 2
是參數,但這只是第一次迭代的返回值。我們現在跳過它,並使用新的輸入值7
,乘以2。
然後我們到達第二個yield
,返回doubleThat
的值,因此返回值為14
。
在下一個(也是最後一個)迭代中,我們傳入100:
calc.next(100)
返回的結果是:
{
done: true
value: 14000
}
因為迭代已完成(找不到更多的yield
關鍵字),我們只返回(input * doubleThat * another)
,即10 * 14 * 100
。