溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ES6中生成器函數(shù)的示例分析

發(fā)布時(shí)間:2020-12-08 10:43:45 來源:億速云 閱讀:124 作者:小新 欄目:web開發(fā)

這篇文章主要介紹了ES6中生成器函數(shù)的示例分析,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

概述

其實(shí)前幾章我都不知道怎么寫,因?yàn)樗麄兛偸巧婕暗揭恍┍容^深的東西,比如可迭代對(duì)象、生成器迭代器之類的東西,等寫完這個(gè)系列,再好好整理一下這些東西可能會(huì)好一點(diǎn),現(xiàn)在整理到哪兒就寫到哪兒吧

語(yǔ)法

function* name([param[, param[, ... param]]])
{ 
    statements 
}

使用function*作為聲明標(biāo)識(shí)符,表示這是一個(gè)生成器函數(shù)

name是函數(shù)名

param是參數(shù)名,可以255個(gè)

statements是函數(shù)體

特點(diǎn)

生成器函數(shù)在執(zhí)行的時(shí)候是可以暫停的,需要的時(shí)候再繼續(xù)執(zhí)行

生成器函數(shù)返回的是一個(gè)迭代器對(duì)象,不會(huì)立即執(zhí)行

生成器函數(shù)可以使用return,但是return之后將不可再迭代

栗子-無限id增長(zhǎng)器

function* idMaker(begin=0){
  while(true)
    yield begin++;
}
let maker=idMaker(0)
console.log(maker.next().value) // 0
console.log(maker.next().value) // 1
console.log(maker.next().value) // 2
console.log(maker.next().value) // 3
...

說明:

調(diào)用生成器函數(shù)返回的是一個(gè)迭代器,迭代器是一個(gè)滿足迭代器協(xié)議的對(duì)象,簡(jiǎn)單的說,迭代器對(duì)象有一定有一個(gè)next函數(shù),該函數(shù)返回一個(gè)對(duì)象,我們稱之為迭代結(jié)果對(duì)象,該對(duì)象包含以下兩個(gè)屬性:

  1. value:本次迭代的結(jié)果

  2. done:布爾值,如果為true,表示無法再繼續(xù)迭代,如果為false,表示可以繼續(xù)迭代。

調(diào)用next函數(shù),將會(huì)讓生成器函數(shù)真正的執(zhí)行,一直執(zhí)行,直到遇見yield,并返回迭代結(jié)果對(duì)象

栗子-有限id增長(zhǎng)器

function* idMaker(begin=0){
  while(begin<3)
    yield begin++;
}
let maker=idMaker(0)
console.log(maker.next()) // {value: 0, done: false}
console.log(maker.next()) // {value: 1, done: false}
console.log(maker.next()) // {value: 2, done: false}
console.log(maker.next()) // {value: undefined, done: true}

如果函數(shù)執(zhí)行完成了,那么done就自動(dòng)變成true

next接收參數(shù)

function *createIterator() {
    let first = yield 1;
    let second = yield first + 2; // 4 + 2 
                                  // first =4 是next(4)將參數(shù)賦給上一條的
    yield second + 3;             // 5 + 3
}

let iterator = createIterator();

console.log(iterator.next());    // "{ value: 1, done: false }"
console.log(iterator.next(4));   // "{ value: 6, done: false }"
console.log(iterator.next(5));   // "{ value: 8, done: false }"
console.log(iterator.next());    // "{ value: undefined, done: true }"

這個(gè)解釋起來挺麻煩,第一次調(diào)用iterator.next(),返回1,代碼停在了yield 1,但是我們將yield 1的結(jié)果保存在了first變量中,其實(shí)這個(gè)操作是沒有發(fā)生的,當(dāng)我們第二次執(zhí)行iterator.next(4),注意這里傳遞了一個(gè)參數(shù)4,此時(shí)會(huì)把4當(dāng)做yield 1的返回值,賦值給first,所以第二次執(zhí)行可以看做是let first=4的這么一個(gè)執(zhí)行順序。

return

function* yieldAndReturn() {
  yield "1";
  return "2";
  yield "3"; 
}
var gen = yieldAndReturn()
console.log(gen.next()); // { value: "1", done: false }
console.log(gen.next()); // { value: "2", done: true }
console.log(gen.next()); // { value: undefined, done: true }

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享ES6中生成器函數(shù)的示例分析內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問題就找億速云,詳細(xì)的解決方法等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI