廈門網(wǎng)頁網(wǎng)絡(luò)營銷優(yōu)化推廣公司
Generator 函數(shù)是 ES6 引入的一種新的函數(shù)類型,它既可以生成一個序列,又可以在某個條件下停止執(zhí)行,并在需要時恢復(fù)執(zhí)行。Generator 函數(shù)非常適合處理那些需要按需計算的場景,例如處理大數(shù)據(jù)、生成隨機數(shù)等。
Generator 函數(shù)的基本語法
Generator 函數(shù)的語法如下:
function* generator() {yield value1;yield value2;// ...
}
其中,* 是 Generator 函數(shù)的標(biāo)識符,yield 是 Generator 函數(shù)的關(guān)鍵字,用于生成一個值。在 Generator 函數(shù)中,每個 yield 都會生成一個值并暫停執(zhí)行,只有調(diào)用 Generator 函數(shù)的 next() 方法時才會繼續(xù)執(zhí)行。
使用 Generator 函數(shù)
下面是一個簡單的例子,展示了如何使用 Generator 函數(shù)生成一個序列:
function* sequence() {let i = 1;while (true) {yield i++;}
}const sequenceGenerator = sequence();
console.log(sequenceGenerator.next()); // { value: 1, done: false }
console.log(sequenceGenerator.next()); // { value: 2, done: false }
console.log(sequenceGenerator.next()); // { value: 3, done: false }
// ...
在上面的例子中,我們定義了一個名為 sequence 的 Generator 函數(shù),用于生成一個從 1 到無窮大的序列。在每次調(diào)用 next() 方法時,Generator 函數(shù)會生成下一個值并返回給調(diào)用者。
控制 Generator 函數(shù)的執(zhí)行
除了通過 next() 方法控制 Generator 函數(shù)的執(zhí)行外,我們還可以使用 return 語句來結(jié)束 Generator 函數(shù)的執(zhí)行,并返回一個值:
function* generator() {yield 1;yield 2;return 3;
}const generatorObj = generator();
console.log(generatorObj.next()); // { value: 1, done: false }
console.log(generatorObj.next()); // { value: 2, done: false }
console.log(generatorObj.next()); // { value: 3, done: true }
在上面的例子中,我們在 Generator 函數(shù)的末尾使用了一個 return 語句,當(dāng)調(diào)用第三次 next() 方法時,Generator 函數(shù)會返回 { value: 3, done: true },表示已經(jīng)完成執(zhí)行。
使用 for…of 循環(huán)遍歷 Generator 函數(shù)生成的序列
除了使用 next() 方法遍歷 Generator 函數(shù)生成的序列外,我們還可以使用 for…of 循環(huán)來遍歷:
function* sequence() {let i = 1;while (true) {yield i++;}
}const sequenceGenerator = sequence();
for (let value of sequenceGenerator) {console.log(value); // 1, 2, 3, ...
}
在上面的例子中,我們使用 for…of 循環(huán)來遍歷 Generator 函數(shù)生成的序列,每次輸出當(dāng)前的值。需要注意的是,for…of 循環(huán)無法判斷 Generator 函數(shù)是否已經(jīng)完成執(zhí)行,因此如果 Generator 函數(shù)已經(jīng)結(jié)束,那么 for…of 循環(huán)將無法繼續(xù)執(zhí)行。