成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文帶你搞懂JavaScript的Generator函數(shù)

開發(fā) 前端
常規(guī)函數(shù)只會(huì)返回一個(gè)單一值(或者不返回任何值)。而 Generator 可以按需一個(gè)接一個(gè)地返回(“yield”)多個(gè)值。它們可與 iterable 完美配合使用,從而可以輕松地創(chuàng)建數(shù)據(jù)流。

一、概念

常規(guī)函數(shù)只會(huì)返回一個(gè)單一值(或者不返回任何值)。

而 Generator 可以按需一個(gè)接一個(gè)地返回(“yield”)多個(gè)值。它們可與 iterable 完美配合使用,從而可以輕松地創(chuàng)建數(shù)據(jù)流。

二、Generator 函數(shù)

要?jiǎng)?chuàng)建一個(gè) generator,需要一個(gè)特殊的語法結(jié)構(gòu):function*,即所謂的 “generator function”。

Generator 函數(shù)與常規(guī)函數(shù)的行為不同。在此類函數(shù)被調(diào)用時(shí),它不會(huì)運(yùn)行其代碼。而是返回一個(gè)被稱為 “generator object” 的特殊對(duì)象,來管理執(zhí)行流程。

例如,可以創(chuàng)建一個(gè) generator 并獲取其第一個(gè)產(chǎn)出的(yielded)值:

function* generateSequence() {
  yield 1;
  yield 2;
  return 3;
}
let generator = generateSequence();
let one = generator.next();
alert(JSON.stringify(one)); // {value: 1, done: false}

截至目前,只獲得了第一個(gè)值,現(xiàn)在函數(shù)執(zhí)行處在第二行:

讓再次調(diào)用 generator.next()。代碼恢復(fù)執(zhí)行并返回下一個(gè) yield 的值:

let two = generator.next();


alert(JSON.stringify(two)); // {value: 2, done: false}

如果第三次調(diào)用 generator.next(),代碼將會(huì)執(zhí)行到 return 語句,此時(shí)就完成這個(gè)函數(shù)的執(zhí)行:

let three = generator.next();
alert(JSON.stringify(three)); // {value: 3, done: true}

運(yùn)行結(jié)果:

三、Generator 是可迭代的

當(dāng)你看到 next() 方法,或許你已經(jīng)猜到了 generator 是 可迭代(iterable)的。(譯注:next() 是 iterator 的必要方法)

可以使用 for..of 循環(huán)遍歷它所有的值:

function* generateSequence() {
  yield 1;
  yield 2;
  return 3;
}
let generator = generateSequence();
for(let value of generator) {
  alert(value); // 1,然后是 2
}

運(yùn)行結(jié)果:

for..of 寫法是不是看起來比 .next().value 優(yōu)雅多了?

注:

上面這個(gè)例子會(huì)先顯示 1,然后是 2,然后就沒了。它不會(huì)顯示 3!

這是因?yàn)楫?dāng) done: true 時(shí),for..of 循環(huán)會(huì)忽略最后一個(gè) value。因此,如果想要通過 for..of 循環(huán)顯示所有的結(jié)果,必須使用 yield 返回它們:

function* generateSequence() {
  yield 1;
  yield 2;
  yield 3;
}
let generator = generateSequence();
for(let value of generator) {
  alert(value); // 1,然后是 2,然后是 3
}

因?yàn)?generator 是可迭代的,可以使用 iterator 的所有相關(guān)功能。

例如:spread 語法 ...:

function* generateSequence() {
  yield 1;
  yield 2;
  yield 3;
}
let sequence = [0, ...generateSequence()];
alert(sequence); // 0, 1, 2, 3

運(yùn)行結(jié)果:

四、Generator 組合

Generator 組合(composition)是 generator 的一個(gè)特殊功能,它允許透明地(transparently)將 generator 彼此“嵌入(embed)”到一起。

例如,有一個(gè)生成數(shù)字序列的函數(shù):組合的 generator 的例子:

function* generateSequence(start, end) {
  for (let i = start; i <= end; i++) yield i;
}
function* generatePasswordCodes() {
  // 0..9
  yield* generateSequence(48, 57);
  // A..Z
  yield* generateSequence(65, 90);
  // a..z
  yield* generateSequence(97, 122);
}
let str = '';
for(let code of generatePasswordCodes()) {
  str += String.fromCharCode(code);
}
alert(str); // 0..9A..Za..z

運(yùn)行結(jié)果:

generator.throw

上面的例子中觀察到的那樣,外部代碼可能會(huì)將一個(gè)值傳遞到 generator,作為 yield 的結(jié)果。

但是它也可以在那里發(fā)起(拋出)一個(gè) error。這很自然。

因?yàn)?error 本身也是一種結(jié)果,要向 yield 傳遞一個(gè) error,應(yīng)該調(diào)用 generator.throw(err)。

在這種情況下,err 將被拋到對(duì)應(yīng)的 yield 所在的那一行。

例:

"2 + 2?" 的 yield 導(dǎo)致了一個(gè) error:

function* gen() {
  try {
    let result = yield "2 + 2 = ?"; // (1)
    alert("The execution does not reach here, because the exception is thrown above");
  } catch(e) {
    alert(e); // 顯示這個(gè) error
  }
}
let generator = gen();


let question = generator.next().value;


generator.throw(new Error("The answer is not found in my database")); // (2)

運(yùn)行結(jié)果:

五、總結(jié)

本文基于JavaScript基礎(chǔ),介紹了Generator函數(shù) ,重點(diǎn)介紹了如何進(jìn)行Generator 組合,采用圖文結(jié)合的方式。采用JavaScript語言,能夠更直觀的的理解,希望能夠幫助讀者更好的學(xué)習(xí)。

歡迎大家積極嘗試,有時(shí)候看到別人實(shí)現(xiàn)起來很簡單,但是到自己動(dòng)手實(shí)現(xiàn)的時(shí)候,總會(huì)有各種各樣的問題,切勿眼高手低,勤動(dòng)手,才可以理解的更加深刻。

代碼很簡單,希望對(duì)你學(xué)習(xí)有幫助。

責(zé)任編輯:華軒 來源: 前端進(jìn)階學(xué)習(xí)交流
相關(guān)推薦

2021-09-07 09:46:40

JavaScriptGenerator函數(shù)

2021-09-28 07:12:10

avaScriptCurrying柯里化

2023-03-06 21:29:41

mmap技術(shù)操作系統(tǒng)

2019-08-06 09:00:00

JavaScript函數(shù)式編程前端

2022-08-15 15:39:23

JavaScript面向?qū)ο?/a>數(shù)據(jù)

2021-12-29 17:38:17

JavaScripttypeof前端

2021-12-01 11:40:14

Python 輸入輸出

2021-09-11 10:41:27

PythonPickle模塊

2021-11-06 10:18:30

Python變量常量

2021-10-14 10:25:05

JavaScript類型函數(shù)

2022-03-24 08:51:48

Redis互聯(lián)網(wǎng)NoSQL

2021-10-11 10:19:48

Javascript 高階函數(shù)前端

2021-08-05 06:54:05

觀察者訂閱設(shè)計(jì)

2020-05-11 14:35:11

微服務(wù)架構(gòu)代碼

2021-07-21 09:24:25

MongoDB數(shù)據(jù)庫 Python

2024-04-12 12:19:08

語言模型AI

2023-05-31 13:32:08

Javalambda函數(shù)

2020-02-21 20:10:13

搞懂事務(wù)隔離級(jí)別

2021-11-20 10:27:43

Python數(shù)據(jù)類型

2021-11-22 06:21:31

Python數(shù)據(jù)類型Python基礎(chǔ)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲成人www | www.日本三级 | 亚洲乱码一区二区三区在线观看 | 激情国产在线 | 精品成人av | 日韩小视频在线 | 精品一区二区久久久久久久网站 | 最新伦理片 | www.黄网| 精品视频一区二区在线观看 | 成人影院免费视频 | 91香蕉视频在线观看 | 一级久久久久久 | 午夜国产一级 | 欧美在线播放一区 | 99这里只有精品 | 国产一区二区黑人欧美xxxx | 福利av在线 | 国产在线麻豆精品入口 | 精品无码久久久久久久动漫 | 国产综合网站 | 国产69久久精品成人看动漫 | 日本黄色一级视频 | 91视频.com | 久久99精品久久久久久国产越南 | 99国产欧美| 久久一区二区三区电影 | 日韩中文一区二区 | 99视频久 | 国产精品视频观看 | 欧美一级在线观看 | 日韩精品一区二区三区在线 | 日韩图区 | 久久久.com| 99热热99| 97中文视频 | 欧美九九九 | 黄色av免费 | 国产免费xxx | 日日想夜夜操 | 亚洲国产成人精品女人久久久 |